Laravel 控制器中间件
我们也可以在路由文件中为控制器的路由分配中间件。
有多种将中间件分配给控制器的方法:
在web.php文件中将中间件分配给控制器。
我们可以在 web.php 文件中为控制器分配中间件。以下是分配中间件所需的步骤:
步骤1: 首先,我们创建一个控制器。我们已经在前一主题中创建了一个名为 PostController 的控制器。
步骤2: 现在,我们创建中间件,我们想要分配给 PostController 。我们使用以下命令来创建中间件:
php artisan make:middleware Check
上面的命令创建了名为Check的中间件。
步骤3: 打开 Check.php 文件,该文件位于 laravelproject/app/http/Middleware 目录中。
<?php
namespace App\Http\Middleware;
use Closure;
class Check
{
/**
* Handle an incoming request.
* @param \Illuminate\Http\Request request
@param \Closurenext
* @return mixed
*/
public function handle(request, Closurenext)
{
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');
上述代码将中间件check分配给PostController。
步骤6: 在浏览器中输入URL http://localhost/laravelproject/public/posts,然后输出结果会是:
使用Controller构造函数
我们也可以使用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";
returnnext(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\Requestrequest
* @return \Illuminate\Http\Response
*/
public function store(Request request)
{
//
}
/**
* Display the specified resource.
* @param intid
* @return \Illuminate\HttpResponse
*/
public function show(id)
{
return "id is :".id;
}
/**
* Show the form for editing the specified resource.
*
* @param int id
* @return
\Illuminate\Http\Response
*/
public function edit(id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request
request
* @param intid
* @return \Illuminate\Http\Response
*/
public function update(Request request,id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int id
* @return \Illuminate\Http\Response
*/
public function destroy(id)
{
//
}}
输出
如果我们访问URL http://localhost/laravelproject/public/posts,那么输出将是:
上面的输出显示,当我们访ask create()方法时,中间件 Check.php 文件(中间件)将不会被执行。
如果我们改变web.php文件的代码,代码如下:
Route::get('posts/{id}', 'PostController@show');
输出
在上述情况中,我们正在访问 PostController.php 文件中的show()方法,因此它也会执行 Check.php 文件(中间件)。
中间件闭包
控制器还允许您使用中间件闭包来注册路由。它允许应用程序为单个控制器定义中间件,而无需单独定义中间件类。
中间件闭包的语法
$this->middleware(function ($request, $next) {
// ...
return $next($request);
});