一. 中間件知識
1. artisan 命令
php artisan make:middleware CheckAge
2. 文件內容
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
public function handle($request, Closure $next)
{
if ($request->age <= 200) {
return redirect('home');
}
//還可以進行一些其他的判定
return $next($request);
}
}
3. 前置中間件和後置中間件
前置中間件和後置中間件區別在於執行動作在$next($request)之前還是之後
//前置中間件
public function handle($request, Closure $next)
{
// 執行動作,在$next($request)之前
$response = $next($request);
return $response;
}
//後置中間件
public function handle($request, Closure $next)
{
$response = $next($request);
// 執行動作在$next($request)之後,return之前
return $response;
}
4. 使用中間件
- 全局中間件
只需在 app/Http/Kernel.php 類中的 $middleware 屬性裏列出這個中間件類 。
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
//更多。。。
];
- 特定路由中間件
只需在 app/Http/Kernel.php 類中的 $routeMiddleware 屬性裏添加,然後在路由中分配給路由
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
//更多。。。
];
//給路由分配中間件
Route::get('admin/profile', function () {
//
})->middleware('auth');
//分配多箇中間件:
Route::get('/', function () {
//
})->middleware('first', 'second');
- 中間件組
只需在 app/Http/Kernel.php 類中的 $middlewareGroups 屬性裏添加,然後在路由中分配給路由
protected $middlewareGroups = [
'web' => [
\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,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'auth:api',
],
];
//一次爲路由分配多箇中間件
Route::get('/', function () {
//
})->middleware('web');
Route::group(['middleware' => ['web']], function () {
//
});
二. 控制器中間件
中間件 可以在路由文件中被分配給控制器路由:
Route::get('profile', 'UserController@show')->middleware('auth');
但是,在控制器的構造方法中指定中間件會更方便。使用控制器構造函數中的 middleware 方法,你可以很容易地將中間件分配給控制器的行爲。你甚至可以約束中間件只對控制器類中的某些特定方法生效:
class UserController extends Controller
{
/**
* 實例化一個新的控制器實例。
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}
}
還能使用閉包來爲控制器註冊中間件。閉包的方便之處在於,你無需特地創建一箇中間件類來爲某一個特殊的控制器註冊中間件:
$this->middleware(function ($request, $next) {
// ...
return $next($request);
});