Laravel控制器中间件

我们还可以在路由文件中将中间件分配给控制器的路由。
有多种将中间件分配给控制器的方法:
在web.php文件中将中间件分配给控制器。
我们可以在web.php文件中将中间件分配给控制器。以下是分配中间件所需的步骤:
步骤1:首先, 我们创建一个控制器。在上一主题中, 我们已经创建了名为PostController的控制器。
步骤2:现在, 我们创建要分配给PostController的中间件。我们使用以下命令来创建中间件:

php artisan make:middleware Check

上面的命令创建一个名为Check的中间件。
Laravel控制器中间件

文章图片
步骤3:打开在laravelproject / app / http / Middleware目录中创建的Check.php文件。
< ?php namespace App\Http\Middleware; use Closure; class Check { /** * Handle an incoming request. * @param\Illuminate\Http\Request$request @param\Closure$next * @return mixed */ public function handle($request, Closure $next) { echo "Middleware in Laravel < br> < br> "; return $next($request); } }

步骤4:现在, 我们必须在kernel.php文件中添加中间件Check.php的路径。
protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'age' => \App\Http\Middleware\CheckAge::class, 'check'=> \App\Http\Middleware\Check::class ];

在上面的代码中, 突出显示的语句添加了中间件的路径, 即Check。
步骤5:在web.php文件中添加以下代码, 以将中间件分配给PostController。
Route::get('posts', 'PostController@create')-> middleware('check');

上面的代码分配了中间件, 即检查到PostController。
步骤6:在Web浏览器中输入URL http:// localhost / laravelproject / public / posts, 那么输出将是:
Laravel控制器中间件

文章图片
使用Controller构造函数
我们还可以使用控制器构造函数来分配中间件。这样做更加方便, 因为它将中间件限制为仅控制器类上的特定方法。
以下是使用Controller构造函数分配中间件所需的步骤:
  • 请按照上一种情况的步骤1到步骤4进行操作。
  • 在web.php文件中添加以下代码:
Route::get('posts', 'PostController@create');

  • 打开PostController.php文件。如果要将中间件分配给PostController的show()方法;然后, 我们需要在PostController.php文件中添加以下代码。
public function __construct() { $this-> middleware('check')-> only('show'); }

上面的代码将中间件分配给仅show()方法。
在PostController中添加以上代码后, postController的结构如下所示:
< ?php namespace App\Http\Controllers; use Illuminate\Http\Request; class PostController extends Controller { /** * Display a listing of the resource. * @return \Illuminate\Http\Response */$this-> middleware(function ($request, $next) { // ... //echo "Middleware in Laravel"; return $next($request); }); public function index(){ // } /** * Show the form for creating a new resource. * @return \Illuminate\Http\Response */public function create(){ return "this is a create method"; }/** * Store a newly created resource in storage.* @param\Illuminate\Http\Request $request * @return \Illuminate\Http\Response */public function store(Request $request) { // } /** * Display the specified resource. * @paramint$id * @return \Illuminate\HttpResponse */public function show($id) { return "id is :". $id; } /** * Show the form for editing the specified resource. * * @paramint$id * @return \Illuminate\Http\Response */public function edit($id){//}/** * Update the specified resource in storage. * * @param\Illuminate\Http\Request $request * @paramint$id * @return \Illuminate\Http\Response */public function update(Request $request, $id){//}/** * Remove the specified resource from storage. * @paramint$id * @return\Illuminate\Http\Response */ public function destroy($id) {// }}

输出量
如果我们访问URL http:// localhost / laravelproject / public / posts, 则输出为:
Laravel控制器中间件

文章图片
上面的输出显示, 当我们访问create()方法时, 将不执行中间件Check.php文件(中间件)。
如果我们更改web.php文件的代码, 则代码为:
Route::get('posts/{id}', 'PostController@show');

输出量
Laravel控制器中间件

文章图片
在上述情况下, 我们正在访问PostController.php文件的show()方法, 因此它也在执行Check.php文件(中间件)。
中间件关闭
控制器还允许你使用中间件闭包来注册路由。它允许应用程序为单个控制器定义中间件, 而无需分别定义中间件类。
【Laravel控制器中间件】中间件关闭的语法
$this-> middleware(function ($request, $next) { // ... return $next($request); });

    推荐阅读