繼續學習lumen5.5php
-----------------------分割線-----------------------laravel
看看是怎麼輸出'Lumen (5.5.2) (Laravel Components 5.5.*)'這個數據web
public目錄下的index.php加載了bootstrap下的app.phpbootstrap
require_once __DIR__.'/../vendor/autoload.php';
//composer的自動加載(new Dotenv\Dotenv(__DIR__.'/../'))->load();
//加載.env的配置api
$app = new Laravel\Lumen\Application( 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
$app->router->group([ 'namespace' => 'App\Http\Controllers', ], function ($router) { require __DIR__.'/../routes/web.php'; });
加載路由文件以便它們能夠所有被添加到應用,這將提供全部請求接口的響應
第一個參數是指定處理接口屬性設置,namespance屬性是指定處理請求的控制器所在目錄
第二個參數是一個閉包函數,傳一個匿名函數到group方法裏composer
找到web.php函數
$router->get('/', function () use ($router) { return $router->app->version(); });
把web.php定義的路由都放在這個這個匿名函數中,至關於下面這樣學習
$app->router->group([ 'namespace' => 'App\Http\Controllers', ], 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();下次再補充....