lumen5.5學習路由和中間件(四)

前幾篇瞭解完從請求到響應的流程後,仔細學習下路由和中間件的玩法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,
]);

Terminable中間件

有些時候中間件須要在 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其實理解得有點虛,有錯記得指出修正,謝謝

相關文章
相關標籤/搜索