Dans cet article, nous allons approfondir le framework Laravel pour comprendre le concept de middleware. La première moitié de cet article commence par une introduction au middleware et à ses utilisations pratiques.
Au fur et à mesure que nous continuons, nous expliquerons comment créer un middleware personnalisé dans une application Laravel. Une fois que nous aurons créé notre middleware personnalisé, nous explorerons les options disponibles pour l'enregistrer auprès de Laravel afin qu'il puisse réellement être appelé pendant le flux de traitement des requêtes.
J'espère que vous vous considérez familier avec les concepts de base de Laravel et l'outil de ligne de commande Artisan pour générer du code d'échafaudage. Bien entendu, une installation fonctionnelle de la dernière application Laravel vous permet d'exécuter immédiatement les exemples fournis dans cet article.
Nous pouvons considérer le middleware comme un mécanisme qui vous permet de vous connecter au flux typique de traitement des requêtes d'une application Laravel. Le traitement typique des routes Laravel passe par certaines étapes de traitement des demandes, et le middleware est l'une des couches par lesquelles l'application doit passer.
Alors, à quoi ça sert de connecter le processus de traitement des requêtes de Laravel ? Pensez aux choses qui doivent être faites dès les premières étapes du démarrage de l’application. Par exemple, les utilisateurs doivent être authentifiés dès le début pour décider s'ils sont autorisés à accéder à l'itinéraire actuel.
Certaines choses auxquelles je peux penser et qui pourraient être réalisées avec un middleware sont :
En fait, l'application Laravel par défaut est déjà livrée avec un middleware important. Il existe par exemple un middleware qui vérifie si le site est en mode maintenance. D'un autre côté, il existe des middlewares pour nettoyer les paramètres de requête d'entrée. Comme je l'ai mentionné plus tôt, l'authentification des utilisateurs est également mise en œuvre via le middleware lui-même.
J'espère que les explications données jusqu'à présent vous ont aidé à vous sentir plus à l'aise avec le terme middleware. Si vous êtes toujours confus, ne vous inquiétez pas car nous commencerons à créer un middleware personnalisé dans la section suivante, qui vous aidera à comprendre exactement comment utiliser le middleware dans le monde réel.
Dans cette section, nous créerons un middleware personnalisé. Mais qu’est-ce que notre middleware personnalisé est censé accomplir exactement ?
Récemment, je suis tombé sur une exigence personnalisée d'un client selon laquelle si un utilisateur accède au site Web à partir de n'importe quel appareil mobile, il doit être redirigé vers l'URL du sous-domaine correspondant, tous les paramètres de chaîne de requête restant inchangés. Je pense qu'il s'agit d'un cas d'utilisation parfait pour démontrer comment utiliser le middleware Laravel dans ce scénario spécifique.
La raison pour laquelle nous souhaitons utiliser un middleware dans ce cas est que nous devons nous connecter au flux de requêtes de l'application. Dans notre middleware personnalisé, nous vérifierons l'agent utilisateur et si l'utilisateur est sur un appareil mobile, il sera redirigé vers l'URL mobile appropriée.
Après avoir discuté de toute la théorie, commençons le développement proprement dit, c'est la meilleure façon de comprendre un nouveau concept, n'est-ce pas ?
En tant que développeur Laravel, si vous souhaitez créer une fonctionnalité personnalisée, vous finirez par utiliser la plupart du temps l'outil Artisan pour créer du code de modèle de base. Utilisons-le pour créer un code de modèle de base pour notre middleware personnalisé.
Accédez à la ligne de commande et accédez à la racine du document de votre projet. Exécutez la commande suivante pour créer un modèle de middleware personnalisé MobileRedirect
.
php artisan make:middleware MobileRedirect
Cela devrait créer un fichier app/Http/Middleware/MobileRedirect.php
en utilisant le code suivant.
<?php namespace App\Http\Middleware; use Closure; class MobileRedirect { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); } }
Vous remarquerez généralement l'implémentation de la méthode handle
, qui fait office d'épine dorsale du middleware et la logique principale du middleware que vous souhaitez implémenter doit se trouver ici.
Profitez de cette occasion pour présenter les types de middleware fournis avec Laravel. Il en existe deux types principaux : le front middleware et le post-middleware.
Comme son nom l'indique, before middleware est un middleware qui s'exécute avant que la requête ne soit réellement traitée et que la réponse ne soit construite. Le post-middleware, en revanche, s'exécute après que la requête a été traitée par l'application et la réponse a déjà été construite à ce moment-là.
Dans notre cas, nous devons rediriger l'utilisateur avant de traiter la requête, elle sera donc développée comme un pré-middleware.
Allez-y et modifiez le fichier avec le contenu suivant app/Http/Middleware/MobileRedirect.php
.
<?php namespace App\Http\Middleware; use Closure; class MobileRedirect { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // check if the request is from mobile device if ($request->mobile == "1") { return redirect('mobile-site-url-goes-here'); } return $next($request); } }
Pour plus de simplicité, nous cochons uniquement mobile
查询字符串参数是否存在,如果将其设置为 TRUE
, puis l'utilisateur sera redirigé vers l'URL du site correspondante pour les appareils mobiles. Bien sûr, si vous souhaitez une détection en temps réel, vous souhaiterez utiliser une bibliothèque de détection d'agent utilisateur.
De plus, vous souhaiterez remplacer l'itinéraire mobile-site-url-goes-here
par l'itinéraire ou l'URL correct, car il ne s'agit que d'un espace réservé à des fins de démonstration.
按照我们的自定义逻辑,调用 $next($request)
允许在应用程序链中进一步处理请求。在我们的例子中需要注意的重要一点是,我们将移动检测逻辑放置在 $next($request)
调用之前,有效地使其成为一个 before 中间件。
这样,我们的自定义中间件就几乎准备好进行测试了。目前,Laravel 无法了解我们的中间件。为此,您需要向 Laravel 应用程序注册您的中间件,这正是我们下一节的主题。
在进入下一部分之前,我想演示一下后中间件的外观,以防万一有人对此感到好奇。
<?php namespace App\Http\Middleware; use Closure; class CustomMiddleWare { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); /* your custom logic goes here */ return $response; } }
正如您已经注意到的,中间件的自定义逻辑在 Laravel 应用程序处理请求后执行。此时,您还可以访问 $response
对象,如果您愿意,它允许您操作它的某些方面。
这就是 after 中间件的故事。
本节描述了向 Laravel 应用程序注册中间件的过程,以便在请求处理流程中实际调用它。
继续打开文件 app/Http/Kernel.php
并查找以下代码片段。
/** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @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, ];
如您所见,$middleware
保存了 Laravel 默认安装附带的中间件数组。此处列出的中间件将根据每个 Laravel 请求执行,因此它是放置我们自己的自定义中间件的理想选择。
继续添加我们的自定义中间件,如以下代码片段所示。
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\MobileRedirect::class, ];
现在,尝试使用查询字符串 mobile=1
访问任何 Laravel 路由,这应该会触发我们的中间件代码!
这就是您应该注册需要在每个请求上运行的中间件的方式。但是,有时您希望仅针对特定路由运行中间件。让我们检查一下如何使用 $routeMiddleware
来实现这一点。
在我们当前示例的上下文中,我们假设如果用户访问您网站上的任何特定路由,他们将被重定向到移动网站。在这种情况下,您不想将中间件包含在 $middleware
列表中。
相反,您希望将中间件直接附加到路由定义,如下所示。
Route::get('/hello-world', 'HelloWorldController@index')->middleware(\App\Http\Middleware\MobileRedirect::class);
事实上,我们可以更进一步,为我们的中间件创建一个别名,这样您就不必使用内联类名。
打开文件 app/Http/Kernel.php
并查找 $routeMiddleware
,它保存了别名到中间件的映射。让我们将我们的条目包含到该列表中,如以下代码片段所示。
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, 'mobile.redirect' => \App\Http\Middleware\MobileRedirect::class ];
修改后的路由定义如下所示。
Route::get('/hello-world', 'HelloWorldController@index')->middleware('mobile.redirect');
这就是向 Laravel 应用程序注册中间件的故事。这非常简单,不是吗?
事实上,我们已经读到了本文的结尾,我希望您能充分享受它。
探索任何框架中的架构概念总是令人兴奋的事情,这就是我们在本文中探索 Laravel 框架中的中间件时所做的事情。
从中间件的基本介绍开始,我们将注意力转移到在 Laravel 应用程序中创建自定义中间件的主题。文章的后半部分讨论了如何向 Laravel 注册自定义中间件,这也是探索附加中间件的不同方式的机会。
希望这次旅程富有成效,并且本文能够帮助您丰富您的知识。另外,如果您希望我在即将发表的文章中提出特定主题,您可以随时给我留言。
今天就这样,如果有任何疑问,请随时使用下面的提要来提出您的疑问!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!