最重要的核心實體在這兒。
/* |-------------------------------------------------------------------------- | Detect The Application Environment |-------------------------------------------------------------------------- | | Laravel takes a dead simple approach to your application environments | so you can just specify a machine name for the host that matches a | given environment, then we will automatically detect it for you. | */ $env = $app->detectEnvironment(array( 'local' => array('homestead'), ));辨認處於開發環境、測試環境、上線環境的程式碼。
有些framework的作法是在index.php或是config.php之類的地方定義關於環境的常數。
那個$env變數沒有在這個檔案用到。但是在獨立出來的另一支start.php檔用到,見下文。
/* |-------------------------------------------------------------------------- | Bind Paths |-------------------------------------------------------------------------- | | Here we are binding the paths configured in paths.php to the app. You | should not be changing these here. If you need to change these you | may do so within the paths.php file and they will be bound here. | */ $app->bindInstallPaths(require __DIR__.'/paths.php');需要用到的路徑字串,有些框架會直接定義成全域常數,並在每個需要的檔案中使用這些全域常數。
Laravel的作法是定義在paths.php內,然後在此處設定進核心實體。
paths.php內的程式碼根本沒幾行。原作者卻連這都要獨立出來,可見對於separation of concerns的嚴格要求。
這種先產生實體、再將某些功能「設定進去」(用「注射進去」描述也許更精準)的作法,稱為Inversion of Control(IoC)。
IoC在Laravel內被非常頻繁的使用,大幅降低了各元件的相依性、提高了程式碼的可讀性。/* |-------------------------------------------------------------------------- | Load The Application |-------------------------------------------------------------------------- | | Here we will load this Illuminate application. We will keep this in a | separate location so we can isolate the creation of an application | from the actual running of the application with a given request. | */ $framework = $app['path.base']. '/vendor/laravel/framework/src'; require $framework.'/Illuminate/Foundation/start.php';最重要的核心實體$app在前面初始化了。此處載入關於此$app實體的一些設定與動作。
這支Foundation/start.php的內容也可以全寫在bootstrap/start.php裏面。
獨立出來是為了???/* |-------------------------------------------------------------------------- | Return The Application |-------------------------------------------------------------------------- | | This script returns the application instance. The instance is given to | the calling script so we can separate the building of the instances | from the actual running of the application and sending responses. | */ return $app;有些框架會將framework的核心函式庫放在根目錄system資料夾內的core資料夾,而vendor資料夾專放第3方函式庫。
Laravel的核心函式庫卻是放在vendor資料夾內的laravel資料夾。
這樣的檔案結構反映了作者想將laravel設計得非常彈性的野心:沒有所謂「core」等級的函式庫,所有函式庫地位一樣、各自獨立、laravel這個框架只是一種將它們兜在一起使用的方式而已。
這個野心本身導致了Laravel的可擴充性、使用上的彈性、以及laravel本身元件(譬如Eloquent ORM)獨立出去使用的可能性。