前幾篇瞭解完從請求到響應的流程後,仔細學習下路由和中間件的玩法php
----------------------------------分割線--------------------------------laravel
基本用法能夠參考中文文檔的路由,要注意的是
1)$app要換成$route
2)namespace不須要寫全,5.5新版本會自動把前面的那部分補全
上一下基本例子:bootstrap
//當路由爲api.com/index.php/user/1/hano/2時, //由ExampleController的show方法響應請求 $router->get('user/{id}/{name}/{sex}', 'ExampleController@show'); //as鍵值對能夠對此路由進行命名,uses指定響應操做 //as的做用有利於生成重定向的URL:redirect()->route('profile'); //middlerware中間件提供了一個方便的機制來過濾進入應用程序的 HTTP 請求 **使用中間件要先在app.php中打開routeMiddleware代碼的註釋進行註冊中間件** // $app->routeMiddleware([ // 'auth' => App\Http\Middleware\Authenticate::class, // 'validate' => App\Http\Middleware\validateMiddle::class, // 'before' => App\Http\Middleware\beforeMiddle::class, // 'after' => App\Http\Middleware\afterMiddle::class, // ]); $router->get('getUrl/{str}', [ 'as' => 'profile', 'uses' => 'ExampleController@getUrl', 'middleware' => 'auth' ]); //路由羣組能夠爲多個路由設置共同屬性,而不需在每一個路由上都設置一次 //namespace命名空間將匹配到的路由給到App\Http\Controllers\User\下的控制器處理 //prefix路由前綴匹配到的路由爲api.com/index.php/admin/{路由名稱} //middleware此組路由都會先通過validate中間件 $router->group([ 'namespace' => 'User', 'prefix' => 'admin', 'middleware => 'validate' ],function() use ($router) { $router->get('getUserInfo/{user_id}', [ 'as' => 'getUserInfo', 'uses' => 'UserController@getUserInfo' ]); $router->post('updateUserInfo/{user_id}', [ 'as' => 'updateUserInfo', 'uses' => 'UserController@updateUserInfo' ]); });
中間件文件都放在app/http/Middleware文件夾中,能夠根據ExampleMiddleware.php進行建立
中間件分前置和後置兩種api
namespace App\Http\Middleware; use Closure; class BeforeMiddleware { //第三個參數爲額外傳參 public function handle($request, Closure $next, $name) { //前置中間件,在執行路由定義指定的操做前作你想作的事情 var_dump($name); return $next($request); } }
<?php namespace App\Http\Middleware; use Closure; class AfterMiddleware { //第三個參數爲額外傳參 public function handle($request, Closure $next, $name) { $response = $next($request); //後置中間件,在執行完路由定義指定的操做後(也就是響應前)作你想作的事情 var_dump($name); return $response; } }
路由可指示多箇中間件,用數組形式表達
附加的中間件參數將會在 $next 參數以後被傳入中間件,用法:數組
//在路由中使用冒號 : 來區隔中間件名稱與指派參數,多個參數可以使用逗號做爲分隔 $router->get('getUrl/{str}', [ 'as' => 'profile', 'uses' => 'ExampleController@getUrl', 'middleware' => ['before:hano','after:hano'] //hano將爲$name的值 ]);
每一個 HTTP 請求都通過一箇中間件,只要將中間件的類加入到 bootstrap/app.php 的 $app->middleware() 調用參數數組中。瀏覽器
$app->middleware([ App\Http\Middleware\Authenticate::class, ]);
有些時候中間件須要在 HTTP 響應被髮送到瀏覽器以後才運行,例如,「session」中間件存儲的 session 數據是在響應被髮送到瀏覽器以後才進行寫入的。想要作到這一點,你須要定義中間件爲「terminable」。session
<?php namespace Illuminate\Session\Middleware; use Closure; class StartSession { public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // 保存 session 數據... } }
terminate 方法必須接收請求($request)及響應($response)兩個參數。一旦定義了 terminable 中間件,你便須要將它增長到 bootstrap/app.php 文件的全局中間件清單列表中。app
$app->middleware([ App\Http\Middleware\Authenticate::class, App\Http\Middleware\terminable::class, ]);
當在你的中間件調用 terminate 方法時,Lumen 會從 服務容器 解析一個全新的中間件實例。post
若是你但願在 handle 及 terminate 方法被調用時使用一致的中間件實例,只需在容器中使用容器的 singleton 方法註冊中間件學習
$app->singleton( App\Http\Middleware\terminable::class );
以上就是路由和中間件的學習,最後那terminable那part其實理解得有點虛,有錯記得指出修正,謝謝