預備核心程序:bootstrap/start.php


最重要的核心實體在這兒。


/*
|--------------------------------------------------------------------------
| 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)獨立出去使用的可能性。

by 阿川先生