文章转自:https://learnku.com/laravel/t… Laravel 中间件是什么?简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。我们可以通过中间件实现以下功能:指定某些路由设置 HTTP 响应头记录请求过滤请求的参数决定是否启用站点维护模式响应前后做一些必要的操作自定义中间件命令行执行下面的简单命令,就可以轻松创建一个新的中间件php artisan make:middleware <MiddlewareName>//MiddlewareName 就是你要创建的中间件的名字执行上面的命令,Laravel 会在 app/Http/Middleware 目录下自动创建一个只包含 handle 方法的中间件。<?phpnamespace 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 必不可少的!中间件也包括前置中间件和后置中间件。“前置中间件” 顾名思义在将请求转发到应用程序之前处理一些逻辑。 另一方面,在中间件之后,在应用程序处理了请求并生成响应之后运行。前置中间件:<?phpnamespace 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); }}后置中间件:<?phpnamespace 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 自带了大多数这些中间件例如 ValidatePostSize, TrimStrings,CheckForMaintenanceMode 等等.路由中间件仅在它们所连接的路由上运行例如 redirectIfAuthenticated.注册中间件创建的任何中间件都必须注册,因为这是 Laravel 知道存在的唯一方式。 要注册中间件,只需打开名为 kernel.php 的文件,该文件位于 Http 文件夹中,如下所示:This file contains list of all registered middlewares that come with Laravel by default. it contains three major arrays which 此文件包含默认 Laravel 提供的所有已注册中间件的列表。 它包含三个主要的中间件组 $middleware , $middlewareGroups 和 $routeMiddleware<?phpnamespace 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::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\TrustProxies::class, ]; /* * 应用程序的路由中间件组. * * @var array / protected $middlewareGroups = [ ‘web’ => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ‘api’ => [ ’throttle:60,1’, ‘bindings’, ], ]; /* * 应用程序的路由中间件. * * 可以将这些中间件分配给组或单独使用。 * * @var array */ 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, //the just created middlware ‘superadmin’ => \App\Http\Middleware\RedirectIfSuperAdmin::class, ];} $middleware 数组包含全局中间件,它运行应用程序的每个HTTP请求,所以如果你想为每个请求运行一个中间件,你应该在这里注册它。 $middlewareGroups 使得可以在组中注册中间件,从而更容易通过使用组名将大量中间件附加到路由。 $routeMiddleware 数组包含各个注册的路由中间件。分配中间件有两个主要方法可以把注册好的中间件应用到路由中。通过控制器的构造方法通过路由通过构造方法分配中间件通过构造方法分配中间有很大的灵活性,它提供了两个重要的方法except($parameters) 和 only($parameters),这两个方法可以允许或阻止中间件应用到控制器中的辅助方法。不使用这两个方法,中间件将使用与控制器的每个方法。<?phpuse 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){ }}使用 except 和 only 方法我们可以选择把中间件应用到指定方法。<?phpuse 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//方法 1Route::get(‘admin/profile’, function () { //action})->middleware(‘auth’);/**方法 2或者像这样使用完全限定的类名:/use App\Http\Middleware\CheckAge;Route::get(‘admin/profile’, function () { // action})->middleware(CheckAge::class);//方法 3Route::group([‘middleware’ => [‘web’]], function () { //action});N:B 中间件组可以像单个中间件一样分配给路由中间件参数其他参数可以传递给中间件。 典型示例是将每个用户ID分配给角色,中间件检查用户的角色以确定是否有权访问所请求的 URI。 参数可以传递给中间件,如下所示:<?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>’); } }通过用逗号分隔每个参数,可以将多个参数传递给中间件。<?phpRoute::get(‘admin/profile’, function () { //action})->middleware(‘auth:<role>,<age>,<country>’); //<role>, <age>, <country> 这里应该被用户想要传递的任何参数替换。这些参数在 $next 变量之后传递给中间件的 handle 函数<?phpclass 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); }}总结要创建中间件,请执行以下过程使用 artisan 命令创建中间件 php artisan make:middleware 中间件名.在app→Http文件夹中的 kernel.php 中注册中间件在创建的中间件中编写逻辑将中间件分配给路由或控制器ConclusionLaravel中间件可以更轻松地保护我们的路由,过滤输入并完成许多其他工作,而无需编写如此多的逻辑。 查看官方 Laravel 文档 这里 了解中间件的更多功能,最重要的是练习。文章转自:https://learnku.com/laravel/t… 更多文章:https://learnku.com/laravel/c…