intergiciel
- Middleware global
- Attribuer un middleware aux routes
- Groupe de middleware
Introduction
Le middleware fournit un mécanisme pratique pour filtrer les requêtes HTTP entrant dans une application. Par exemple, Laravel inclut un middleware qui vérifie l'authentification des utilisateurs pour votre application. Si l'utilisateur n'est pas authentifié, le middleware redirigera l'utilisateur vers l'interface de connexion. Cependant, si l'utilisateur est authentifié, le middleware autorisera en outre la requête adressée à l'application.
Bien entendu, en plus de l'authentification de l'identité, des middlewares supplémentaires peuvent également être écrits pour effectuer diverses tâches. Par exemple : le middleware CORS peut être chargé d'ajouter des informations d'en-tête appropriées à toutes les réponses quittant l'application ; le middleware de journalisation peut enregistrer toutes les demandes entrant dans l'application.
Laravel est livré avec certains middleware, notamment l'authentification, la protection CSRF, etc. Tous ces middlewares se trouvent dans le répertoire
app/Http/Middleware
.app/Http/Middleware
目录。定义中间件
通过运行
make:middleware
Artisan 命令来创建新的中间件:php artisan make:middleware CheckAge
该命令会在
app/Http/Middleware
目录下创建一个新的CheckAge
类,在这个中间件中,我们仅允许age
参数大于200
的请求对此路由进行访问,否则,将重定向到home
<?php namespace App\Http\Middleware; use Closure;class CheckAge{ /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->age <= 200) { return redirect('home'); } return $next($request); } }
正如你所见,假如给定的
age
参数小于或等于200
,这个中间件将返回一个 HTTP 重定向到客户端;否则,请求将进一步传递到应用中。要让请求继续传递到应用程序中(即允许「通过」中间件验证的),只需使用$request
作为参数去调用回调函数$next
。最好将中间件想象为一系列
HTTP
请求,必须经过才能进入你应用的「层」。每一层都会检查请求(是否符合某些条件),(如果不符合)甚至可以(在请求访问你的应用之前)完全拒绝掉。{提示} 所有的中间件都是通过 服务容器,因此,可以在你的中间件的构造函数中键入你需要的任何依赖。
前置 & 后置中间件
中间件是在请求之前或者之后执行,取决于中间件的本身。例如,下面的中间件将在应用处理请求 之前 执行某些任务:
<?php namespace App\Http\Middleware; use Closure;class BeforeMiddleware{ public function handle($request, Closure $next) { // Perform action return $next($request); } }
然而,这个中间件是在应用请求 之后执行某些任务:
<?php namespace App\Http\Middleware; use Closure; class AfterMiddleware{ public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; } }
注册中间件
全局中间件
如果你希望中间件在应用处理每个 HTTP 请求期间运行。只需要在
app/Http/Kernel.php
中的$middleware
Définissez le middleware en exécutant la commandemake:middleware
Artisan Pour créer un nouveau middleware : 🎜// 在 App\Http\Kernel 类中... protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, ];
🎜Cette commande créera une nouvelle classeCheckAge
dans le répertoireapp/Http/Middleware
Dans ce middleware, nous autorisons uniquement les requêtes avec <. code>age supérieurs à200
pour accéder à cette route, sinon, elle sera redirigée vershome
🎜Route::get('admin/profile', function () { // })->middleware('auth');
🎜Comme vous pouvez le voir, si étant donné que le Le paramètreage
est inférieur ou égal à200
, ce middleware renverra une redirection HTTP au client sinon, la requête sera ensuite transmise à l'application ; Pour permettre à la requête de se diriger vers l'application (c'est-à-dire permettre au middleware de "réussir" la validation), appelez simplement la fonction de rappel$next
avec$request
comme paramètre. 🎜🎜Il est préférable de considérer le middleware comme une série de requêtesHTTP
qui doivent être traitées pour accéder à la « couche » de votre application. Chaque couche vérifie la demande (si elle remplit certaines conditions) et peut même la refuser entièrement (si ce n'est pas le cas) (avant de demander l'accès à votre application). 🎜🎜{Astuce} Tous les middlewares passent par le conteneur de services, donc toutes les dépendances dont vous avez besoin peuvent être saisies dans le constructeur de votre middleware. 🎜
🎜Pré-& post-middleware
🎜Le middleware est exécuté avant ou après la requête, en fonction du middleware lui-même . Par exemple, le middleware suivant effectuera certaines tâches avant que l'application traite la requête : 🎜Route::get('/', function () { // })->middleware('first', 'second');
🎜 Cependant, ce middleware effectuera certaines tâches après les requêtes de l'application : 🎜use App\Http\Middleware\CheckAge; Route::get('admin/profile', function () { // })->middleware(CheckAge::class);
🎜 🎜🎜🎜🎜Enregistrement du middleware🎜🎜🎜🎜🎜Middleware global
🎜Si vous souhaitez que le middleware s'exécute lors de chaque requête HTTP traitée par votre application. Répertoriez simplement ce middleware dans l'attribut$middleware
dansapp/Http/Kernel.php
🎜🎜🎜🎜🎜🎜🎜Attribuer un middleware aux routes
Supposons que vous souhaitiez attribuer un middleware à une route spécifiée. Tout d'abord, vous devez attribuer une clé au middleware dans le fichier
app/Http/Kernel.php
. Par défaut, le middleware intégré de Laravel est inclus sous l'attribut$routeMiddleware
dans cette classe. Pour ajouter un middleware personnalisé, ajoutez-le simplement à la liste et attribuez-lui une clé personnalisée. Par exemple :app/Http/Kernel.php
文件内为该中间件分配一个键。默认情况下,该类中的$routeMiddleware
属性下包含了 Laravel 内置的中间件。若要加入自定义的中间件,只需把它附加到列表后并为其分配一个自定义键。例如:/** * 应用程序的路由中间件组 * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ ' throttle:60,1', 'auth:api',], ];
一旦在 HTTP 内核中定义好了中间件,就可以通过
middleware
方法将为路由分配中间件:Route::get('/', function () { // })->middleware('web'); Route::group(['middleware' => ['web']], function () { // });
你也可以为路由分配多个中间件:
/** * 中间件的优先级排序列表 * * 将会强制非全局中间件始终保持给定的顺序。 * * @var array */ protected $middlewarePriority = [ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\Authenticate::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Illuminate\Auth\Middleware\Authorize::class,];
分配中间件时,还可以传递完整的类名:
<?php namespace App\Http\Middleware; use Closure;class CheckRole{ /** * 处理传入的参数 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $role * @return mixed */ public function handle($request, Closure $next, $role) { if (! $request->user()->hasRole($role)) { // Redirect... } return $next($request); } }
中间组件
某些时候你可以希望使用一个键把多个中间件打包成一个组,方便将他们应用到路由中去。你可以使用 Http 核心的
$middlewareGroups
属性。Laravel 内置了开箱即用的
web
和api
中间件组,其中包含你可能希望应用于 Web UI 和 API 路由的常用中间件:Route::put('post/{id}', function ($id) { // })->middleware('role:editor');
中间件组可以使用于单个中间件相同的语法分配给路由和控制器操作。同样,中间件使得一次将多个中间件分配给一个路由更加方便:
<?php namespace Illuminate\Session\Middleware; use Closure; class StartSession{ public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Store the session data... } }
{提示}
RouteServiceProvider
默认将web
中间件组自动应用到routes/web.php
。Sorting(排序) 中间件
很少情况下,你可能需要中间件以特定的顺序执行,但是当它们被分配到路由时,你无法控制它们的顺序。在这种情况下,可以使用
rrreeeapp/Http/Kernel.php
文件的$middlewarePriority
属性指定中间件优先级:中间件参数
中间件还可以接收其他参数。例如,如果你的应用程序需要在执行给定操作之前验证用户是否为给定的「角色」 ,你可以创建一个
CheckRole
中间件,由它来接收「角色」名称作为附加参数。附加的中间参数应该在
rrreee$next
参数之后传递给中间件:定义路由时通过一个
Une fois le middleware défini dans le noyau HTTP, vous pouvez attribuer un middleware à la route via la méthode:
rrreeemiddleware
:rrreeeVous pouvez également attribuer plusieurs middleware à la route : rrreee
Lors de l'attribution d'un middleware, vous pouvez également transmettre le nom complet de la classe :rrreee🎜🎜🎜🎜Composants intermédiaires🎜 🎜 Parfois, vous souhaiterez peut-être utiliser une clé pour regrouper plusieurs middlewares dans un groupe afin de faciliter leur application aux routes. Vous pouvez utiliser l'attribut$middlewareGroups
du noyau HTTP. 🎜🎜Laravel intègre des groupes de middlewareweb
etapi
prêts à l'emploi, qui incluent des middlewares courants que vous souhaiterez peut-être appliquer à l'interface utilisateur Web et au routage API : 🎜rrreee 🎜 Les groupes de middleware peuvent être affectés à des actions de routage et de contrôleur en utilisant la même syntaxe que les middlewares individuels. De même, le middleware facilite l'attribution simultanée de plusieurs middlewares à une route : 🎜rrreee🎜{Tip}
🎜🎜🎜RouteServiceProvider
applique automatiquement le groupe de middlewaresweb
par défaut. Accédez àroutes/web.php
. 🎜🎜🎜Tri (tri) middleware 🎜🎜Dans de rares cas, vous pouvez Middleware est requis pour s'exécuter dans un ordre spécifique, mais vous n'avez aucun contrôle sur leur ordre lorsqu'ils sont affectés à des itinéraires. Dans ce cas, vous pouvez spécifier la priorité du middleware à l'aide de l'attribut$middlewarePriority
du fichierapp/Http/Kernel.php
: 🎜rrreee🎜🎜🎜🎜LearnKu.com🎜. 🎜🎜Paramètres du middleware
🎜Le middleware peut également recevoir d'autres paramètres. Par exemple, si votre application doit vérifier que l'utilisateur occupe un « rôle » donné avant d'effectuer une action donnée, vous pouvez créer un middlewareCheckRole
qui reçoit le nom du « rôle » en tant que paramètre d'ajout. 🎜🎜Des paramètres intermédiaires supplémentaires doivent être transmis au middleware après le paramètre$next
: 🎜rrreee🎜Lors de la définition de la route, transmettez un:
pour séparer le nom du middleware et les paramètres. Paramètres du middleware. Utilisez des virgules pour séparer plusieurs paramètres : 🎜rrreee🎜🎜🎜🎜🎜🎜Middleware terminable
Parfois, le middleware peut devoir effectuer un certain travail après avoir préparé la réponse HTTP. Par exemple, le middleware « session » intégré de Laravel écrit les données de session dans le stockage lorsque la réponse est entièrement prête. Si vous définissez une méthode
rrreeeterminate
sur votre middleware, elle sera appelée automatiquement une fois que la réponse sera prête à être envoyée au navigateur. La méthodeterminate
方法,那么它将会在响应准备发送到浏览器之后自动调用。terminate
方法应该同时接收请求和响应。定义了这个中间件之后,别忘了将它添加到路由列表或者app/Http/Kernel.php
文件的全局中间件中。当你在中间件上调用
terminate
方法的时候, Laravel 将从 服务容器 中解析出一个新的中间件实例。如果在调用handle
和terminate
方法的同时使用相同的中间件实例,请使用容器的singleton
rrreeeterminate
doit recevoir à la fois la demande et la réponse. Après avoir défini ce middleware, n'oubliez pas de l'ajouter à la liste de routes ou middleware global dans le fichierapp/Http/Kernel.php
. Cet article a été publié pour la première fois sur le site