php artisan make:middleware <middleware-name>
使用你的中間件名稱替換<middleware-name>。創(chuàng)建可以看到中間件在 app/Http/Middleware 目錄。
php artisan make:middleware AgeMiddleware
第3步 ? AgeMiddlware 會(huì)在 app/Http/Middleware 文件中創(chuàng)建。新創(chuàng)建的文件將自動(dòng)創(chuàng)建下面代碼:
<?php namespace App\Http\Middleware; use Closure; class AgeMiddleware { public function handle($request, Closure $next) { return $next($request); } }
全局中間件將在應(yīng)用程序的每個(gè)HTTP請(qǐng)求運(yùn)行,而路由中間件將被分配到一個(gè)特定的路由。中間件可在 app/Http/Kernel.php 注冊(cè).
該文件包含兩個(gè)屬性: $middleware 和 $routeMiddleware。$middleware 屬性用于注冊(cè)全局中間件,$routeMiddleware屬性用于注冊(cè)路由指定中間件。
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, ];
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, ];
我們已經(jīng)在前面的例子中已創(chuàng)建 AgeMiddleware 中間件。 現(xiàn)在,我們可以在具體的路由中間件屬性登記。注冊(cè)代碼如下所示。
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { 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, ]; protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'Age' => \App\Http\Middlware\AgeMiddleware::class, ]; }
我們也可以傳遞中間件參數(shù)。例如,如果您的應(yīng)用程序有不同角色,如用戶,管理員,超級(jí)管理員等,并且要驗(yàn)證基于角色的動(dòng)作,這可以通過參數(shù)傳遞中間件來實(shí)現(xiàn)。我們創(chuàng)建的中間件包含以下功能,我們可以通過 $next 參數(shù)之后,自定義參數(shù)。
public function handle($request, Closure $next) { return $next($request); }
php artisan make:middleware RoleMiddleware
第3步 ? 添加以下代碼到新創(chuàng)建的角色中間件的處理方法 - app/Http/Middleware/RoleMiddleware.php.
<?php namespace App\Http\Middleware; use Closure; class RoleMiddleware { public function handle($request, Closure $next, $role) { echo "Role: ".$role; return $next($request); } }
第4步 ? 在 app\Http\Kernel.php 文件中注冊(cè)角色中間件。 加入灰色突出的線條的是在該文件中注冊(cè) RoleMiddleware 中間件。
php artisan make:controller TestController
app/Http/TestController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class TestController extends Controller { public function index(){ echo "<br>Test Controller."; } }
app/Http/routes.php
Route::get('role',[ 'middleware' => 'Role:editor', 'uses' => 'TestController@index', ]);
響應(yīng)已經(jīng)發(fā)送給瀏覽器后可終止中間件執(zhí)行一些任務(wù)。這可以通過使用創(chuàng)建中間件“終止”方法的中間件來實(shí)現(xiàn)??山K止中間件會(huì)注冊(cè)全局中間件。該終止方法將接受兩個(gè)參數(shù):$request 和 $response。終止方法可以被創(chuàng)建,如在下面顯示的代碼。
php artisan make:middleware TerminateMiddleware
第3步 - 復(fù)制下面的代碼到新創(chuàng)建文件 - TerminateMiddleware 在 app/Http/Middleware/TerminateMiddleware.php 文件中如下:
<?php namespace App\Http\Middleware; use Closure; class TerminateMiddleware { public function handle($request, Closure $next) { echo "Executing statements of handle method of TerminateMiddleware."; return $next($request); } public function terminate($request, $response){ echo "<br>Executing statements of terminate method of TerminateMiddleware."; } }
第4步 ? 注冊(cè) TerminateMiddleware 到 app\Http\Kernel.php 文件中.
加了灰色突出的線條的是該文件中注冊(cè)的 TerminateMiddleware 中間件。
php artisan make:controller ABCController
app/Http/ABCController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ABCController extends Controller { public function index(){ echo "<br>ABC Controller."; } }
app/Http/routes.php
Route::get('terminate',[ 'middleware' => 'terminate', 'uses' => 'ABCController@index', ]);
http://localhost:8000/terminate