PHP laravel系列之中間件

1、什麼是中間件?

經過以前對路由和控制器的學習,咱們知道一個請求能夠經過路由分配到某個控制器上而後進行處理,若是咱們想對請求加一個限制,只容許某些請求可以到達控制器,而過濾掉咱們不想要的請求,這時候就可使用 Laravel 的中間件。
例如,Laravel 自帶的 Auth 中間件能夠用來驗證用戶的身份,若是用戶未經過身份驗證,中間件將會把用戶導向登陸頁面,反之,當用戶經過了身份驗證,中間件將會經過此請求並接着往下執行。
固然了,除了驗證,中間件也能夠完成其餘的各類各樣的任務,如:CORS 中間件負責替全部即將離開程序的響應加入適當的標頭;而日誌中間件則能夠記錄全部傳入應用程序的請求。
Laravel 框架已經內置了一些中間件,包括維護、身份驗證、CSRF 保護,等等。全部的中間件都放在 app/Http/Middleware 目錄內。
除了 Laravel 內置的中間件之外,咱們也能夠根據本身的須要建立中間件。php

2、建立中間件

下面咱們經過一個簡單的例子來體會一下 midddleware 的工做過程。
思路以下:
1. 建立一個帶參路由,用來產生一個請求,而且附帶一個 age 參數;
2. 建立一個簡單的中間件,用來過濾掉 age > 25 的用戶,來實現一個簡單的中間件過濾;
3. 未經過中間件的請求將被重定向到主頁;
4. 經過中間件的的請求將達到指定的控制器,實現相應動做。
首先建立帶參路由:java

app/Http/routes.php
<?php
Route::get('/', function () {
    return view('welcome');
});
Route::get('/young/{age}','UserController@young');

根據咱們的思路:
• age > 25的路由如 網址/young/56 應該被過濾
• age <= 25的路由如 網址/young/18 應該被經過
而後建立中間件,咱們使用 artisan 來建立:web

cd ~/Code/myweb
php artisan make:middleware YoungMiddleware

此命令將會在 app/Http/Middleware 目錄內建立一個名稱爲 YoungMiddleware 的中間件。
在這個中間件內咱們只容許請求的年齡 age 變量小於 25 時才能訪問路由,不然,咱們會將用戶重定向到首頁。
打開這個中間件:
app/Http/Middleware/YoungMiddleware.php瀏覽器

<?php namespace App\Http\Middleware; use Closure; class YoungMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); } }

默認生成的中間件代碼是沒作任何過濾的,也就是說任何請求都會經過。
下面咱們加入咱們的過濾代碼:bash

<?php

namespace App\Http\Middleware;

use Closure;

class YoungMiddleware {
    /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */
    public function handle($request, Closure $next) {
        // 若是傳入的參數 age 大於25,重定向到'/'
        if ($request->age > 25) {
            return redirect('/');
        }
        return $next($request);
    }
}

至此,中間件建立完成。markdown

3、註冊並添加中間件

中間件建立好後,還須要註冊並添加到相應的路由上,才能工做。
註冊中間件:app

打開 app/Http/Kernel.php
app/Http/Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /** * The application's global HTTP middleware stack. * * @var array */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ];

    /** * The application's route middleware. * * @var array */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,

    ];
}

若是你但願每一個 HTTP 請求都通過一箇中間件,只要將該中間件的類加入到 app/Http/Kernel.php 的 middlewareapp/Http/Kernel.php routeMiddleware 屬性清單列表中,並給這個中間件起一個名字。
由於咱們這裏只須要對咱們本節實驗開始建立的路由添加這個中間件,因此咱們修改代碼以下:
app/Http/Kernel.php框架

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /** * The application's global HTTP middleware stack. * * @var array */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,

        //若是須要全局中間件在這裏註冊
    ];

    /** * The application's route middleware. * * @var array */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        //在這裏添加了一行
        'young' => \App\Http\Middleware\YoungMiddleware::class,
    ];
}

註冊完成後,咱們回到routes.php文件中爲路由添加中間件。
打開 app/Http/routes.php 修改代碼:
app/Http/routes.php學習

<?php
Route::get('/young/{age}', 'UserController@young')->middleware('young');

這裏注意後面添加部分!!!
至此,一個簡單的中間件就完成了!
此時,根據咱們以前的思路:
• age > 25 的路由如 網址/young/56 應該會被重定向到 ‘/’
• age <= 25 的路由如 網址/young/18 應該會經過中間件,到達控制器UserController@young
最後,完成控制器部分的代碼。
使用 artisan 命令建立一個控制器:測試

php artisan make:controller UserController  --plain

添加 –plain 後綴能夠不生成默認的空方法。
打開app/Http/Controllers/UserController.php,添加young()方法:
app/Http/Controllers/UserController.php

<?php class UserController extends Controller { public function young(){ return 'I`m young!'; } }

至此,全部的代碼都完成了,打開瀏覽器測試一下效果。
訪問 localhost/young/18 成功顯示,以下圖:
這裏寫圖片描述
訪問 localhost/young/56 重定向到了 ‘/’ 以下圖:
有沒有感受這張畫面很美好呢!!!

畫面至關美好了!!!

4、小結


我的總結:
中間件用於過濾 首先在原來的控制器、路由是不用修改的,增長過濾只要指向中間件就行了,這裏框架裏爲了增長可讀性而增長了kernel,能夠註冊,也就是給原來中間件的位置起一個別名
形式以下:Route::get(‘/young/{age}’, ‘Mycontroller@young’)->middleware(‘young’);
中間件的書寫方式:
一、建立中間件 app/Http/Middleware下建立中間件文件
二、註冊並添加中間件 app/Http/Kernel.php文件中註冊中間件
三、修改routes app/Http/routes.php

參考:實驗樓

相關文章
相關標籤/搜索