深入解析Laravel的中间件
Laravel 中间件是什么?简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。 我们可以通过中间件实现以下功能:
自定义中间件命令行执行下面的简单命令,就可以轻松创建一个新的中间件 php artisan make:middleware <MiddlewareName> //MiddlewareName 就是你要创建的中间件的名字 执行上面的命令,Laravel 会在 <?php namespace AppHttpMiddleware; use Closure; class RedirectIfSuperAdmin { /** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @return mixed */ public function handle($request,Closure $next) { return $next($request); } } 在中间件被调用的时候, “前置中间件” 顾名思义在将请求转发到应用程序之前处理一些逻辑。 另一方面,在中间件之后,在应用程序处理了请求并生成响应之后运行。 前置中间件: <?你的逻辑就在这里 ); } } 后置中间件: <?) { $response = ); 你的逻辑就在这里 例如 重定向到 `/` $response; } } 中间件的类别
全局中间件针对命中应用程序的每个请求运行。 Laravel 自带了大多数这些中间件例如 路由中间件仅在它们所连接的路由上运行 注册中间件创建的任何中间件都必须注册,因为这是 Laravel 知道存在的唯一方式。 要注册中间件,只需打开名为 此文件包含默认 Laravel 提供的所有已注册中间件的列表。 它包含三个主要的中间件组 $middleware ,?$middlewareGroups 和?$routeMiddleware
<?php namespace AppHttp; use IlluminateFoundationHttpKernel as HttpKernel; class Kernel extends HttpKernel { * * 应用程序的全局HTTP中间件。 * * 这些中间件在应用程序的每个请求期间运行。 * * @var array protected $middleware = [ IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class, IlluminateFoundationHttpMiddlewareValidatePostSize:: AppHttpMiddlewareTrimStrings:: IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull:: AppHttpMiddlewareTrustProxies:: ]; * * 应用程序的路由中间件组. * * @var array $middlewareGroups = [ 'web' => [ AppHttpMiddlewareEncryptCookies:: IlluminateCookieMiddlewareAddQueuedCookiesToResponse:: IlluminateSessionMiddlewareStartSession:: IlluminateSessionMiddlewareAuthenticateSession::class, IlluminateViewMiddlewareShareErrorsFromSession:: AppHttpMiddlewareVerifyCsrfToken:: IlluminateRoutingMiddlewareSubstituteBindings:: ],'api' => [ 'throttle:60,1','bindings',1)">* * 应用程序的路由中间件. * * 可以将这些中间件分配给组或单独使用。 * * @var array $routeMiddleware = [ 'auth' => IlluminateAuthMiddlewareAuthenticate::the just created middlware 'superadmin' => AppHttpMiddlewareRedirectIfSuperAdmin:: ]; }
分配中间件有两个主要方法可以把注册好的中间件应用到路由中。
通过构造方法分配中间件 通过构造方法分配中间有很大的灵活性,它提供了两个重要的方法 <?php IlluminateHttpRequest; 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(){ } } 通过路由分配中间件如果注册的中间件可以直接附加到路由,如下所示: <?方法 1 Route::get('admin/profile',1)"> () { action })->middleware('auth'); *方法 2 或者像这样使用完全限定的类名: */ AppHttpMiddlewareCheckAge; Route::get('admin/profile',1)"> () { action })->middleware(CheckAge::方法 3 Route::group(['middleware' => ['web']],1)">action }); N:B 中间件组可以像单个中间件一样分配给路由 中间件参数其他参数可以传递给中间件。 典型示例是将每个用户 ID 分配给角色,中间件检查用户的角色以确定是否有权访问所请求的 URI。 参数可以传递给中间件,如下所示: <?方法1 (Through route) Route::get('admin/profile',1)">action })->middleware('auth:<role>'); <role> 这里应该被用户想要传递的任何参数替换。 //方法2 (Through a controller) __construct(){ $this->middleware('auth:<role>'); } } 通过用逗号分隔每个参数,可以将多个参数传递给中间件。 <?php Route::get('admin/profile',1)">action })->middleware('auth:<role>,<age>,<country>'); <role>,<country> 这里应该被用户想要传递的任何参数替换。 这些参数在 <?$next,$role,1)">$age,1)">$country) { 使用解析参数的中间件逻辑 ); } } 摘要要创建中间件,请执行以下过程
结论Laravel 中间件可以更轻松地保护我们的路由,过滤输入并完成许多其他工作,而无需编写如此多的逻辑。 查看官方 Laravel 文档?这里?了解中间件的更多功能,最重要的是练习。 更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新) 还有更多进阶学习资料可以免费领取进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |