目录
- 1. 中间件知识
- 1. artisan 命令
- 2. 文件内容
- 3. 前置中间件和后置中间件
- 4. 使用中间件
- 2. 控制器中间件
1. 中间件知识
1. artisan 命令
php artisan make:middleware CheckAge
2. 文件内容
<?phpnamespace 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 () {//
});
2. 控制器中间件
中间件 可以在路由文件中被分配给控制器路由:
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);
});