首頁  >  文章  >  php框架  >  半小時搞定Laravel目錄結構與配置

半小時搞定Laravel目錄結構與配置

WBOY
WBOY轉載
2022-02-15 17:33:402656瀏覽

這篇文章為大家帶來了Laravel目錄結構與配置的相關知識,Laravel的目錄結構相對來說在初始狀態下會更豐富一些,除了傳統的控制器之外,也幫我們準備好了腳本、中間件之類的程式碼檔案的目錄,基本上是可以達到上手直接使用的,希望對大家有幫助。

半小時搞定Laravel目錄結構與配置

Laravel 目錄結構與配置

Laravel 的目錄結構相對來說在初始狀態下會更豐富一些,除了傳統的控制器之外,也幫我們準備好了腳本、中間件之類的程式碼檔案的目錄,基本上是可以達到上手直接使用的。

目錄結構

首先我們來看一看根目錄都有什麼。

半小時搞定Laravel目錄結構與配置

其實根據名字就能知道這些目錄的作用,比如說 app 目錄是具體的應用程式碼。 config 目錄是存放設定檔資訊的。在上篇文章中,我們提到如果在虛擬機器中使用Laravel 的話,是需要用到server.php 這個根目錄下的檔案的,其實這個檔案就是在根目錄下載入了public/index.php 這個文件。

bootstrap 是在啟動框架的時候需要載入的文件,一般不太會修改這個文件裡面的內容,在這個目錄下還包含 cache 相關的目錄文件。 database 很明顯是資料庫相關的內容。 public 就是我們框架的入口目錄,其他資源檔案也可以放在這裡,像是直接顯示的圖片、靜態檔案之類的。 resources 存放的是視圖和未編譯的資源檔。

routes 目錄是路由檔案所存放的目錄,這個目錄很重要,當然,其實也就是這裡面的路由檔案很重要。它裡面預設包含 web.php 、api.php 、channels.php 以及 console.php ,分別代表預設的 web 請求路由、api 請求路由、註冊事件廣播以及基於閉包的控制台腳本指令。

storage 目錄是用於儲存應用程式產生的各類文件,包括快取、日誌等資訊。 tests 目錄包含自動化測試相關的內容。

在這些目錄中,我們再專注於 app 目錄中包含的內容。

半小時搞定Laravel目錄結構與配置

app 目錄是我們應用程式開發中使用最多的目錄。我們應用的控制器、模型、中間件之類的內容都在這個目錄中。

Console 目錄是我們寫的命令列腳本目錄,也就是可以自訂的透過 php artisan 運行的命令列功能都在這個目錄中。

Exceptions 是我們可以自訂的異常類別。 Models 中存放我們自訂的資料模型。 Providers 目錄中存放的是預設的以及我們可以自訂的一些服務提供者。

接下來是 Http 目錄。

Controllers 不用多說了,控制器都寫在這裡。 Middleware 放的是預設的中間件,當然,我們自訂的中間件也可以寫在這個目錄裡面。

Kernel.php 是請求核心的控製文件,在這個文件中,我們可以定義請求的中間件。這也是一個非常重要的核心文件,將來學習到的時候我們再詳細的講解說明。

設定檔

關於目錄結構的內容其實就是上面這些,接下來我們再來看看設定檔也就是根目錄下config 目錄裡面的內容,這裡面的內容也是我們常常需要接觸到的。

半小時搞定Laravel目錄結構與配置

其實從這些設定檔的名字就可以看出它們的作用。在接下來的文章中我們馬上就要接觸到的就是 database.php 這個文件,因為在入門相關的內容中,我們還是要簡單地連下資料庫體驗一下的。

在 database.php 中,不僅可以定義要連接的 mysql 資料庫信息,也可以定義要連接的 NoSQL 類型的資料庫(預設已經給了 redis 的連接配置)。我們這裡先看下 MySQL 連線資訊。

'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

透過設定檔程式碼,我們可以看到很多資訊都是透過 env() 這個函數取得的。而這個函數取得到的內容其實是根目錄下的 .env 這個檔案裡面的內容。打開這個 .env 文件,我們可以看到它和 php.ini 文件的設定方式是相似的,都是 key=value 這種形式的設定資訊。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

在這裡,我們就可以設定目前環境下的資料庫連線資訊。這樣配置有什麼好處呢?

独立的配置文件这种形式的很容易实现配置中心,也很容易实现测试环境和正式环境的分别部署。一般我们不会将这个 .env 放到 git 中,或者跟随代码上传。在正式环境或者测试环境都是手动地或者通过配置中心来进行配置。这样的话,我们就不需要修改源代码,只需要使用不同的这个 .env 配置文件就可以实现不同的环境下运行相同的代码了。

通过 XDebug ,我们可以追踪到 env() 这个方法在底层调用了 vlucas 的 DotEnv 这个 Composer 组件来进行 PHPENV 类型文件的读写加载。

对于加载来说,在程序运行的时候,我们会通过下面这段代码来进行加载。

// laravel/framework/src/Illuminate/Foundation/Application.php
foreach ($bootstrappers as $bootstrapper) {
    $this['events']->dispatch('bootstrapping: '.$bootstrapper, [$this]);

    $this->make($bootstrapper)->bootstrap($this);

    $this['events']->dispatch('bootstrapped: '.$bootstrapper, [$this]);
}

其中核心是 $this->make($bootstrapper)->bootstrap($this); 这一段,它在循环中会加载所有 $bootstrappers 数组中的内容,这个数组里面的内容是在 laravel/framework/src/Illuminate/Foundation/Http/Kernel.php 中的类变量 $bootstrappers 所定义的。第一个环境变量启动加载器就是我们加载配置文件所需要的,如下所示:

// laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
/**
 * The bootstrap classes for the application.
 *
 * @var string[]
 */
protected $bootstrappers = [
    \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
    \Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
    \Illuminate\Foundation\Bootstrap\HandleExceptions::class,
    \Illuminate\Foundation\Bootstrap\RegisterFacades::class,
    \Illuminate\Foundation\Bootstrap\RegisterProviders::class,
    \Illuminate\Foundation\Bootstrap\BootProviders::class,
];

源码中和代码中的 Bootstrap 相关的内容都是启动加载器的实现,从文件名就可以看出,这个启动加载器是加载环境变量相关内容的。.env 文件里面的配置信息也将是以整体的环境变量的形式加载到系统中。

// laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php
$this->createDotenv($app)->safeLoad();

LoadEnvironmentVariables.php 中会通过上述代码进入到 DotEnv 组件中,通过以下方法读取配置文件相关的信息。

// vlucas/phpdotenv/src/Dotenv.php
create() 

// vlucas/phpdotenv/src/Loader/Loader.php 
load()

最后通过 ServerConstAdapter.php 文件中的 write() 方法将这些配置文件中的信息写入到 $_SERVER 全局变量数组中。

//vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php 
/**
 * Write to an environment variable, if possible.
 *
 * @param string $name
 * @param string $value
 *
 * @return bool
 */
public function write(string $name, string $value)
{
    $_SERVER[$name] = $value;

    return true;
}

在路由文件中,我们可以通过打印 \$_SERVER 数据看到配置文件里面我们配置过的信息。之后的读取,也直接是读取这个 $_SERVER 中的数据。

Route::get('/', function () {
    var_dump($_SERVER);

    var_dump(env('REDIS_PASSWORD')); // null
    $_SERVER['REDIS_PASSWORD'] = '123456';
    var_dump(env('REDIS_PASSWORD')); // string '123456'
    
    return view('welcome');
});

其实反过来看,我们的 Laravel 就是将 .env 文件中的数据缓存到了全局变量 $_SERVER ,然后我们在将来使用的时候就直接从全局变量中获取就可以了,这样就可以避免下一次还要从文件读取,从而提高系统效率。

总结

一开始以为就是简单地讲讲目录和配置文件,没想到吧,直接就进入源码的分析了。当然,这只是开胃菜而已。对于框架架构的学习,一定要配置好 XDebug 之类的调试工具,如果没这些工具,这种使用了许多 Composer 组件来回调用的代码还真不好找出最终实现的地方。

后面的文章也都会以这样的方式进行,需要注意的是,我们的源码都是在 vendor 目录下的,所以有的文章中这个路径我就没有写了。

【相关推荐:laravel视频教程

以上是半小時搞定Laravel目錄結構與配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除