繼續學習lumen5.5
———————–分割線———————–
看看是怎麼輸出`Lumen (5.5.2) (Laravel Components 5.5.*)`這個資料
public目錄下的index.php載入了bootstrap下的app.php
require_once __DIR__.`/../vendor/autoload.php`;
//composer的自動載入(new DotenvDotenv(__DIR__.`/../`))->load();
//載入.env的配置
$app = new LaravelLumenApplication(
realpath(__DIR__.`/../`)
);//初始化應用
//初始化的內容
public function __construct($basePath = null)
{
if (! empty(env(`APP_TIMEZONE`))) {
date_default_timezone_set(env(`APP_TIMEZONE`, `UTC`));
}
//指定專案基礎目錄
$this->basePath = $basePath;
//註冊服務容器
$this->bootstrapContainer();
//註冊異常處理
$this->registerErrorHandling();
//例項化Route路由類
$this->bootstrapRouter();
}
然後是註冊核心元件進服務容器中(laravel的服務容器後面再學習)
主要看
$app->router->group([
`namespace` => `AppHttpControllers`,
], function ($router) {
require __DIR__.`/../routes/web.php`;
});
載入路由檔案以便它們可以全部被新增到應用,這將提供所有請求介面的響應
第一個引數是指定處理介面屬性設定,namespance屬性是指定處理請求的控制器所在目錄
第二個引數是一個閉包函式,傳一個匿名函式到group方法裡
找到web.php
$router->get(`/`, function () use ($router) {
return $router->app->version();
});
把web.php定義的路由都放在這個這個匿名函式中,相當於下面這樣
$app->router->group([
`namespace` => `AppHttpControllers`,
], function ($router) {
$router->get(`/`, function () use ($router) {
return $router->app->version();
});
});
然後看Router類裡面的group方法,有一個
call_user_func($callback, $this);
這段程式碼執行傳進來的匿名函式,就是web.php定義的所有路由
$router->get(`/`, function () use ($router) {
return $router->app->version();
});
找到Router類裡面的get方法看到呼叫了addRoute方法,看到名字就大概知道是新增路由的意思
/**
* Add a route to the collection.
*
* @param array|string $method
* @param string $uri
* @param mixed $action
* @return void
*/
public function addRoute($method, $uri, $action)
{
$action = $this->parseAction($action);
$attributes = null;
if ($this->hasGroupStack()) {
$attributes = $this->mergeWithLastGroup([]);
}
if (isset($attributes) && is_array($attributes)) {
if (isset($attributes[`prefix`])) {
$uri = trim($attributes[`prefix`], `/`).`/`.trim($uri, `/`);
}
if (isset($attributes[`suffix`])) {
$uri = trim($uri, `/`).rtrim($attributes[`suffix`], `/`);
}
$action = $this->mergeGroupAttributes($action, $attributes);
}
$uri = `/`.trim($uri, `/`);
if (isset($action[`as`])) {
$this->namedRoutes[$action[`as`]] = $uri;
}
if (is_array($method)) {
foreach ($method as $verb) {
$this->routes[$verb.$uri] = [`method` => $verb, `uri` => $uri, `action` => $action];
}
} else {
$this->routes[$method.$uri] = [`method` => $method, `uri` => $uri, `action` => $action];
}
}
裡面做的就是把在web.php定義的路由翻譯成你想要處理的方式,最後都放在$routes這個屬性當中,這裡可以參考文件中[HTTP 路由][1]部分(這是舊版中文文件,新版要看官網的英文版,不同之處在於$app換成$route,舊的路由定義檔案是routes.php,新的是web.php)
可以把上面那個請求路由的程式碼翻譯成,當請求路由為`api.com/index.php/`時候,呼叫匿名函式
function () use ($router) {
return $router->app->version();
}
進行響應;可以看出當執行匿名函式時呼叫的是application類裡面的version方法
public function version()
{
return `Lumen (5.5.2jjj) (Laravel Components 5.5.*)`;
}
PS:這裡只是return,還不是echo輸出,繼續往下看,$app->run();下次再補充….