指令列工具:artisan

#!/usr/bin/env php

注意第1行,在指令列的某些情況下才需要。
參見:Is #!/usr/bin/env required to run PHP from command line?

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/

require __DIR__.'/bootstrap/autoload.php';

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let's turn on the lights.
| This bootstraps the framework and gets it ready for and then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight these users.
|
*/

$app = require_once __DIR__.'/bootstrap/start.php';

上面這段讀取自動載入檔案、啟動Laravel框架的檔案,跟入口檔案是一樣的。
參見:起點:public/index.php


/*
|--------------------------------------------------------------------------
| Load The Artisan Console Application
|--------------------------------------------------------------------------
|
| We'll need to run the script to load and return the Artisan console
| application. We keep this in its own script so that we will load
| the console application independent of running commands which
| will allow us to fire commands from Routes when we want to.
|
*/

$app->setRequestForConsoleEnvironment();

$artisan = Illuminate\Console\Application::start($app);

/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/

$status = $artisan->run();

/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running. We will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/

$app->shutdown();

exit($status);

後面這段code非常巧妙。在public/index.php裏面,$app是框架類別初始化出來的物件,接著$app->run來讓整個程序動起來。
但在這裡卻是先將$app設定request來源為console,接著把整個物件當作參數丟給Illuminate\Console\Application類別,最後執行$artisan->run並且將$app->shutdown關機。
為什麼在命令列執行本身不算是$app的任務,而是由額外類別的實體$artisan來負責?
為什麼實體$artisan需要$app當作參數,而不是自己在內部執行一次初始化程序?
原作者抽象化思考的方式非常值得深入揣測。

我不喜歡Application::start這個靜態函式的命名。
既然回傳了實體,應該叫create或是make之類的。

by 阿川先生