什么是 Laravel 中间件?如何管理实施?
Laravel 中间件是什么?
简单来说,laravel 中中间件的作用就是过滤 HTTP 请求,并根据不同的请求执行不同的逻辑操作。
通过中间件我们可以实现以下功能:
- 确定具体路由
- 设置HTTP响应头
- 记录请求
- 过滤请求以确定维护模式。 在响应之前和之后执行一些必要的操作
自定义中间件
在命令行运行以下简单命令,可以轻松创建一个新的中间件
php artisan make:middleware <MiddlewareName>
//MiddlewareName 就是你要创建的中间件的名字
复制代码
运行上面的命令,Laravel 将在❀中间件仅包含方法handle
会在Http/Middleware目录中自动创建。
<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
复制代码
调用中间件时,会执行handle
方法。这里值得注意的是,handle方法默认有两个参数$request
和$next
。 $request
用于接收应用程序请求组,$next
向应用程序发送请求。这两个参数对于处理
很重要!中间件又包括前中间件和后中间件。
“预中间件”顾名思义,在将请求转发到应用程序之前处理一些逻辑。另一方面,一旦中间件在应用程序处理请求并生成响应后运行。
前置中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//你的逻辑就在这里
return $next($request);
}
}
复制代码
后置中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
//你的逻辑就在这里 例如 重定向到 `/`
return $response;
}
}
复制代码
中间件类别
- 全局中间件
- 路由中间件
每个开放中间件应用程序
Laravel 附带了大多数中间件,例如 仅在连接到通过打开 此文件包含默认 Laravel 列表提供的所有已注册中间件。它包含三个主要中间件组 将注册的中间件应用到路由有两种主要方法。 通过构造函数分配中间件 通过构造函数分配中间件有很大的灵活性,提供了两个重要的方法 meter($parameter 使用 如果注册的中间件可以直接附加到路由上,如下: N:B组中间件可以像单个中间件一样分配到一个路由 其他参数可以发送到中间件,典型的例子是每个用户ID分配一个角色,中间件检查用户的角色以确定其是否有权访问所请求的 URI。参数可以传递给中间件,如下所示: 可以将多个参数传递给中间件,每个参数之间用逗号分隔。 该参数在变量 要使用中间件创建中间件,请按照以下流程操作: middleware Creator :middleware 中间件名称. 作者:阿布阿布ValidatePostSize
、TrimStrings
、CheckForMaintenance
创建的任何中间件的路由上重定向中间件片段例如 redirectIfAuthenticated。
,我们可以选择将中间件应用到特定的方法上,如下: ♶只需要注册为 Laravel 知道存在的中间件即可。要注册中间件,请打开位于 Http 文件夹中名为
kernel.php
的文件,如下所示: $middleware
,$middlewaregroups
和$utemiddlewarewarewarewware♶中间件♶middleware♶s每个HTTP请求的应用程序,因此,如果要运行对于每个请求的中间件,您必须在这里注册。
和 $middlewareGroups
可以按组注册中间件,从而可以更轻松地使用组名称将多个中间件附加到路由。 $routeMiddleware
包含每个列出的路由中间件的数组。 中间件分发
only( $parameter)
,这两个方法可以允许或阻止中间件应用于控制器中的辅助方法。如果不使用这两个方法,中间件将与每个控制器方法一起使用。<?php
use Illuminate\Http\Request;
class ForumController extends Controller
{
public function __construct(){
/**in this case the middleware named auth is applied
to every single function within this controller
*/
$this->middleware('auth');
}
public function viewForum(){
return view('index');
}
public function edit($id){
}
public function delete($id){
}
}
复制代码
除了
和之外<?php
use Illuminate\Http\Request;
class ForumController extends Controller
{
public function __construct(){
/**the authentication middleware here applies to all functions but
viewForums() and viewForumDetails() and the opposite of this happens
when you use only()
*/
$this->middleware('auth')->except(['viewForums', 'viewForumDetails']);
}
public function viewForums(){
return view('index');
}
public function edit($id){
}
public function delete($id){
}
public function viewForumDetails(){
}
}
复制代码
通过路由定义中间件
<?php
//方法 1
Route::get('admin/profile', function () {
//action
})->middleware('auth');
/**方法 2
或者像这样使用完全限定的类名:
*/
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
// action
})->middleware(CheckAge::class);
//方法 3
Route::group(['middleware' => ['web']], function () {
//action
});
复制代码
中间件参数
<?php
//方法1 (Through route)
Route::get('admin/profile', function () {
//action
})->middleware('auth:<role>'); //<role> 这里应该被用户想要传递的任何参数替换。
//方法2 (Through a controller)
use Illuminate\Http\Request;
class ForumController extends Controller
{
public function __construct(){
$this->middleware('auth:<role>');
}
}
复制代码
<?php
Route::get('admin/profile', function () {
//action
})->middleware('auth:<role>,<age>,<country>'); //<role>, <age>, <country> 这里应该被用户想要传递的任何参数替换。
复制代码
$next
<?php
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $role, $age, $country)
{
//使用解析参数的中间件逻辑
return $next($request);
}
}
复制代码
摘要
结论Laravel中间件可以轻松实现保护我们的路线、过滤输入并做许多其他事情,而无需编写逻辑。请查看此处的 Laravel 官方文档,了解有关中间件可以做什么以及最重要的是实践的更多信息。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。