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

本篇文章給大家帶來了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?=?[ ????IlluminateFoundationBootstrapLoadEnvironmentVariables::class, ????IlluminateFoundationBootstrapLoadConfiguration::class, ????IlluminateFoundationBootstrapHandleExceptions::class, ????IlluminateFoundationBootstrapRegisterFacades::class, ????IlluminateFoundationBootstrapRegisterProviders::class, ????IlluminateFoundationBootstrapBootProviders::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視頻教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享