久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【Laravel系列2.2】Laravel 目錄結(jié)構(gòu)與配置

 硬核項(xiàng)目經(jīng)理 2022-01-20

Laravel 目錄結(jié)構(gòu)與配置

Laravel 的目錄結(jié)構(gòu)相對來說在初始狀態(tài)下會更豐富一些,,除了傳統(tǒng)的控制器之外,也幫我們準(zhǔn)備好了腳本,、中間件之類的代碼文件的目錄,,基本上是可以達(dá)到上手直接使用的。

目錄結(jié)構(gòu)

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

其實(shí)根據(jù)名字就能知道這些目錄的作用,,比如說 app 目錄是具體的應(yīng)用代碼,。config 目錄是存放配置文件信息的。在上篇文章中,,我們提到過如果在虛擬機(jī)中使用 Laravel 的話,,是需要用到 server.php 這個(gè)根目錄下的文件的,其實(shí)這個(gè)文件就是在根目錄下加載了 public/index.php 這個(gè)文件,。

bootstrap 是在啟動(dòng)框架的時(shí)候需要加載的文件,,一般不太會修改這個(gè)文件里面的內(nèi)容,在這個(gè)目錄下還包含 cache 相關(guān)的目錄文件,。database 很明顯是數(shù)據(jù)庫相關(guān)的內(nèi)容,。public 就是我們框架的入口目錄,另外一些資源文件也可以放在這里,,比如直接顯示的圖片,、靜態(tài)文件之類的。resources 存放的是視圖和未編譯的資源文件,。

routes 目錄是路由文件所存放的目錄,,這個(gè)目錄很重要,當(dāng)然,,其實(shí)也就是這里面的路由文件很重要,。它里面默認(rèn)包含 web.php 、api.php ,、channels.php 以及 console.php ,,分別代表默認(rèn)的 web 請求路由、api 請求路由,、注冊事件廣播以及基于閉包的控制臺腳本命令,。

storage 目錄是用于存儲應(yīng)用程序生成的各類文件,包括緩存,、日志等信息,。tests 目錄包含自動(dòng)化測試相關(guān)的內(nèi)容。

在這些目錄中,,我們再重點(diǎn)看一下 app 目錄中包含的內(nèi)容,。

app 目錄是我們應(yīng)用開發(fā)中使用最多的目錄。我們應(yīng)用的控制器,、模型,、中間件之類的內(nèi)容都在這個(gè)目錄中。

Console 目錄是我們寫的命令行腳本目錄,,也就是可以自定義的通過 php artisan 運(yùn)行的命令行功能都在這個(gè)目錄中,。

Exceptions 是我們可以自定義的異常類。Models 中存放我們自定義的數(shù)據(jù)模型。Providers 目錄中存放的是默認(rèn)的以及我們可以自定義的一些服務(wù)提供者,。

接下來是 Http 目錄,。

Controllers 不用多說了,控制器都寫在這里,。Middleware 放的是默認(rèn)的中間件,,當(dāng)然,我們自定義的中間件也可以寫在這個(gè)目錄里面,。

Kernel.php 是請求內(nèi)核的控制文件,,在這個(gè)文件中,我們可以定義請求的中間件,。這也是一個(gè)非常重要的核心文件,,將來學(xué)習(xí)到的時(shí)候我們再詳細(xì)的講解說明。

配置文件

關(guān)于目錄結(jié)構(gòu)的內(nèi)容其實(shí)就是上面這些,,接下來我們再來看看配置文件也就是根目錄下 config 目錄里面的內(nèi)容,,這里面的內(nèi)容也是我們經(jīng)常需要接觸到的。

其實(shí)從這些配置文件的名字就可以看出它們的作用,。在接下來的文章中我們馬上就要接觸到的就是 database.php 這個(gè)文件,,因?yàn)樵谌腴T相關(guān)的內(nèi)容中,我們還是要簡單地連下數(shù)據(jù)庫體驗(yàn)一下的,。

在 database.php 中,,不僅可以定義要連接的 mysql 數(shù)據(jù)庫信息,也可以定義要連接的 NoSQL 類型的數(shù)據(jù)庫(默認(rèn)已經(jīng)給了 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() 這個(gè)函數(shù)獲取的,。而這個(gè)函數(shù)獲取到的內(nèi)容其實(shí)是根目錄下的 .env 這個(gè)文件里面的內(nèi)容,。打開這個(gè) .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=

在這里,我們就可以配置當(dāng)前環(huán)境下的數(shù)據(jù)庫連接信息,。這樣配置有什么好處呢,?

獨(dú)立的配置文件這種形式的很容易實(shí)現(xiàn)配置中心,也很容易實(shí)現(xiàn)測試環(huán)境和正式環(huán)境的分別部署,。一般我們不會將這個(gè) .env 放到 git 中,,或者跟隨代碼上傳,。在正式環(huán)境或者測試環(huán)境都是手動(dòng)地或者通過配置中心來進(jìn)行配置,。這樣的話,我們就不需要修改源代碼,只需要使用不同的這個(gè) .env 配置文件就可以實(shí)現(xiàn)不同的環(huán)境下運(yùn)行相同的代碼了,。

通過 XDebug ,,我們可以追蹤到 env() 這個(gè)方法在底層調(diào)用了 vlucas 的 DotEnv 這個(gè) Composer 組件來進(jìn)行 PHPENV 類型文件的讀寫加載。

對于加載來說,,在程序運(yùn)行的時(shí)候,,我們會通過下面這段代碼來進(jìn)行加載。

// 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); 這一段,,它在循環(huán)中會加載所有 $bootstrappers 數(shù)組中的內(nèi)容,,這個(gè)數(shù)組里面的內(nèi)容是在 laravel/framework/src/Illuminate/Foundation/Http/Kernel.php 中的類變量 $bootstrappers 所定義的。第一個(gè)環(huán)境變量啟動(dòng)加載器就是我們加載配置文件所需要的,,如下所示:

// 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 相關(guān)的內(nèi)容都是啟動(dòng)加載器的實(shí)現(xiàn),,從文件名就可以看出,這個(gè)啟動(dòng)加載器是加載環(huán)境變量相關(guān)內(nèi)容的,。.env 文件里面的配置信息也將是以整體的環(huán)境變量的形式加載到系統(tǒng)中,。

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

LoadEnvironmentVariables.php 中會通過上述代碼進(jìn)入到 DotEnv 組件中,通過以下方法讀取配置文件相關(guān)的信息,。

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

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

最后通過 ServerConstAdapter.php 文件中的 write() 方法將這些配置文件中的信息寫入到 $_SERVER 全局變量數(shù)組中,。

//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 數(shù)據(jù)看到配置文件里面我們配置過的信息,。之后的讀取,,也直接是讀取這個(gè) $_SERVER 中的數(shù)據(jù)。

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');
});

其實(shí)反過來看,,我們的 Laravel 就是將 .env 文件中的數(shù)據(jù)緩存到了全局變量 $_SERVER ,,然后我們在將來使用的時(shí)候就直接從全局變量中獲取就可以了,這樣就可以避免下一次還要從文件讀取,,從而提高系統(tǒng)效率,。

總結(jié)

一開始以為就是簡單地講講目錄和配置文件,沒想到吧,,直接就進(jìn)入源碼的分析了,。當(dāng)然,這只是開胃菜而已,。對于框架架構(gòu)的學(xué)習(xí),,一定要配置好 XDebug 之類的調(diào)試工具,如果沒這些工具,,這種使用了許多 Composer 組件來回調(diào)用的代碼還真不好找出最終實(shí)現(xiàn)的地方,。

后面的文章也都會以這樣的方式進(jìn)行,需要注意的是,,我們的源碼都是在 vendor 目錄下的,,所以有的文章中這個(gè)路徑我就沒有寫了,。

參考文檔:

https:///docs/laravel/8.x/configuration/9355

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多