Laravel 中间件是什么?
简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。
我们可以通过中间件实现以下功能:
- 指定某些路由
- 设置 HTTP 响应头
- 记录请求
- 过滤请求的参数
- 决定是否启用站点维护模式
- 响应前后做一些必要的操作
自定义中间件
命令行执行下面的简单命令,就可以轻松创建一个新的中间件
PHP artisan make:middleware <MiddlewareName> //MiddlewareName 就是你要创建的中间件的名字
执行上面的命令,Laravel 会在app/Http/Middleware
目录下自动创建一个只包含handle
方法的中间件。
<?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
将请求传递给应用程序。这两个参数是handle
必不可少的!中间件也包括前置中间件和后置中间件。
“前置中间件” 顾名思义在将请求转发到应用程序之前处理一些逻辑。 另一方面,在中间件之后,在应用程序处理了请求并生成响应之后运行。
前置中间件:
<?你的逻辑就在这里 ); } }
后置中间件:
<?) { $response = ); 你的逻辑就在这里 例如 重定向到 `/` $response; } }
中间件的类别
- 全局中间件
- 路由中间件
全局中间件针对命中应用程序的每个请求运行。 Laravel 自带了大多数这些中间件例如ValidatePostSize
, TrimStrings
,CheckForMaintenanceMode
等等.
路由中间件仅在它们所连接的路由上运行
例如redirectIfAuthenticated
.
注册中间件
创建的任何中间件都必须注册,因为这是 Laravel 知道存在的唯一方式。 要注册中间件,只需打开名为kernel.PHP
的文件,该文件位于 Http 文件夹中,如下所示:
此文件包含默认 Laravel 提供的所有已注册中间件的列表。 它包含三个主要的中间件组
$middleware
, $middlewareGroups
和 $routeMiddleware
<?PHP namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { * * 应用程序的全局HTTP中间件。 * * 这些中间件在应用程序的每个请求期间运行。 * * @var array protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize:: \App\Http\Middleware\TrimStrings:: \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull:: \App\Http\Middleware\TrustProxies:: ]; * * 应用程序的路由中间件组. * * @var array $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies:: \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse:: \Illuminate\Session\Middleware\StartSession:: \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession:: \App\Http\Middleware\VerifyCsrfToken:: \Illuminate\Routing\Middleware\SubstituteBindings:: ],'api' => [ 'throttle:60,1','bindings',1)">* * 应用程序的路由中间件. * * 可以将这些中间件分配给组或单独使用。 * * @var array $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::the just created middlware 'superadmin' => \App\Http\Middleware\RedirectIfSuperAdmin:: ]; }
$middleware
数组包含全局中间件,它运行应用程序的每个 HTTP 请求,所以如果你想为每个请求运行一个中间件,你应该在这里注册它。$middlewareGroups
使得可以在组中注册中间件,从而更容易通过使用组名将大量中间件附加到路由。$routeMiddleware
数组包含各个注册的路由中间件。
分配中间件
- 通过控制器的构造方法
- 通过路由
通过构造方法分配中间件
通过构造方法分配中间有很大的灵活性,它提供了两个重要的方法except($parameters)
和only($parameters)
,这两个方法可以允许或阻止中间件应用到控制器中的辅助方法。不使用这两个方法,中间件将使用与控制器的每个方法。
<?PHP Illuminate\Http\Request; class ForumController Controller { function __construct(){ *in this case the middleware named auth is applied to every single function within this controller */ $this->middleware('auth'); } viewForum(){ return view('index'function edit($id){ } function delete(){ } }
<?*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']); } viewForums(){ viewForumDetails(){ } }
通过路由分配中间件
如果注册的中间件可以直接附加到路由,如下所示:
N:B 中间件组可以像单个中间件一样分配给路由
中间件参数
通过用逗号分隔每个参数,可以将多个参数传递给中间件。
这些参数在$next
变量之后传递给中间件的 handle 函数
<?$next,$role,1)">$age,1)">$country) { 使用解析参数的中间件逻辑 ); } }
要创建中间件,请执行以下过程
结论
还有更多进阶学习资料可以免费领取进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】