Maison  >  Article  >  cadre php  >  Thinkphp5.1 explique en détail l'utilisation du middleware

Thinkphp5.1 explique en détail l'utilisation du middleware

WBOY
WBOYavant
2022-04-24 11:56:104119parcourir

Cet article vous apporte des connaissances pertinentes sur thinkphp, qui présente principalement l'utilisation du middleware, y compris ce que sont le pré-middleware, le post-middleware, le middleware de routage et le middleware global. Jetons un coup d'œil au contenu pertinent ci-dessous, je l'espère. sera utile à tout le monde.

Thinkphp5.1 explique en détail l'utilisation du middleware

Etude recommandée : "Tutoriel vidéo PHP"

1. Le rôle du middleware

Le middleware est principalement utilisé pour intercepter ou filtrer la requête HTTP de l'application, et effectuer Traitement commercial nécessaire. Par exemple, un middleware peut être utilisé pour vérifier si les informations demandées par l'utilisateur contiennent un cheval de Troie d'une seule phrase. HTTP请求,并进行必要的业务处理。比如可以使用中间件来检查用户的请求信息里是否包含一句话木马。

行为钩子和中间件的区别:

中间件:它是对项目请求做处理,在用户访问我们的项目时,中间件就可以对于这个请求来判断用户是否有权限,或者判断用户是否存在非法访问;

行为钩子:在某一动作开始或者结束的时候会触发的方法,比如用户注册成功记录日志;

中间件是对用户请求做处理,而钩子则是对用户动作的处理,中间件相当于过滤器,钩子相当于事件,都是采用AOP思想。

二、定义中间件

首先,可以通过cmd命令行指令快速生成中间件,在项目的根目录里执行以下cmd命令:

php think make:middleware Check

 这个指令会 application/http/middleware目录下面生成一个Check中间件,代码如下:

<?php

namespace app\http\middleware;

class Check
{
    public function handle($request, \Closure $next)
    {
        if ($request->param('name') == 'index') {
            return redirect('/');//重定向到首页
        }

        return $next($request);//返回的是一个Response对象
    }
}

 中间件说明:

1、中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包;

2、中间件handle方法的返回值必须是一个Response对象;

3、中间件里可以直接使用Request对象,获取请求参数;

4、在某些需求下,可以使用第三个参数传入额外的参数;

public function handle($request, \Closure $next, $name){
    if ($name == 'index') {
        return redirect('/');//重定向到首页
    }

    return $next($request);
}

1、前置中间件

前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。

<?php

namespace app\http\middleware;

class Before
{
    public function handle($request, \Closure $next)
    {
        // 先执行中间件代码
        return $next($request);
    }
}

2、后置中间件

后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。

<?php

namespace app\http\middleware;

class After
{
    public function handle($request, \Closure $next)
    {
		$response = $next($request);
        //后执行中间件代码
        return $response;
    }
}

三、注册中间件

1、路由中间件

顾名思义,就是指定在某个路由下才会去调用这个中间件,即用户访问了这个路由链接,就会执行这个中间件。

//用户登录的路由
Route::rule(&#39;login&#39;,&#39;index/User/login&#39;)->middleware('Auth');

 或者使用完整的中间件类名:

Route::rule('login','index/User/login')->middleware(app\http\middleware\Auth::class);

 说明:中间件的注册建议使用完整的类名,如果没有指定命名空间则默认使用apphttpmiddleware作为命名空间

同一个路由也支持注册多个中间件,只需要middleware()里用逗号隔开即可:

Route::rule('login','index/User/login')->middleware(['Auth', 'Check']);

Thinkphp5.1.8+ 版本后,支持对路由分组注册中间件,如下:

//一个名为user的路由分组
Route::group('user', function(){
	Route::rule('login','index/User/login');
    Route::rule('register','index/User/register');
})->middleware('Auth');

2、全局中间件

意思就是说,所有的(全局)http访问请求,都会自动调用这个中间件。

在application目录下创建middleware.php文件,代码如下:

<?php
return [
    //第1个中间件
	\app\http\middleware\Auth::class,
    //第2个中间件(Check中间件没有指定命名空间,所以会默认使用app\http\middleware作为命名空间)
    &#39;Check&#39;,
];

3、模块中间件

Thinkphp5.1.8+版本以上支持模块中间件定义,你可以直接在模块目录下面增加middleware.php文件,定义方式和全局中间件定义一样,只是只会在该模块下面生效。

4、控制器中间件

Thinkphp5.1.17+版本以上支持为控制器定义中间件。首先你的控制器需要继承系统的thinkController类,然后在控制器中定义middleware属性,例如:

<?php
namespace app\index\controller;
use think\Controller;

class Index extends Controller{

    protected $middleware = [&#39;Auth&#39;];

    public function index()
    {
        return &#39;index&#39;;
    }
}

5、使用闭包定义中间件

在某些简单的场合,我们不需要使用中间件类,这时候可以使用闭包定义中间件,但闭包函数必须返回Response

La différence entre les hooks comportementaux et le middleware :

Middleware : traite les demandes de projet. Lorsqu'un utilisateur accède à notre projet, le middleware peut déterminer si l'utilisateur a l'autorisation pour cette demande ou si l'utilisateur a un accès illégal

Hook de comportement : une méthode qui sera déclenchée lorsqu'une action démarre ou se termine, comme la journalisation de l'enregistrement réussi d'un utilisateur ;

Le middleware traite les demandes des utilisateurs, tandis que les hooks traitent les actions des utilisateurs, le middleware est équivalent à un filtre et les hooks sont équivalents aux événements. , qui adoptent tous deux les idées AOP.

🎜 2. Définir le middleware 🎜🎜🎜Tout d'abord, vous pouvez générer rapidement un middleware via la commande de ligne de commande cmd Exécutez la commande cmd suivante dans le répertoire racine du projet : 🎜
Route::group(&#39;hello&#39;, function(){
	Route::rule(&#39;login&#39;,&#39;index/User/login&#39;);
})->middleware(function($request,\Closure $next){
    if ($request->param('name') == 'index') {
        return redirect('/');//重定向到首页
    }    
	return $next($request);
});
🎜 Cette commande . application/ Un middleware <code>Check est généré sous le répertoire http/middleware Le code est le suivant : 🎜
<?php
return [
	[\app\http\middleware\Auth::class, &#39;张三&#39;],
    &#39;Check:李四&#39;,
];
🎜 Middleware. description : 🎜🎜1. La méthode d'exécution d'entrée du middleware doit être la méthode handle, et le premier paramètre est l'objet Request, et le deuxième paramètre est une fermeture ; 🎜🎜 2. La valeur de retour de la méthode handle du middleware doit être un objet Response 🎜🎜3. L'objet Request peut être utilisé directement dans le middleware ; obtenir les paramètres de la requête ; 🎜🎜4. Sous certaines conditions, vous pouvez utiliser le troisième paramètre pour transmettre des paramètres supplémentaires 🎜
Route::rule(&#39;login&#39;,&#39;index/User/login&#39;)->middleware('Auth:张三');

1. Pré-middleware

🎜Pré-middleware signifie qu'avant la requête http est terminé, exécutez le code middleware. 🎜
Route::rule('login','index/User/login')->middleware(Auth::class, '张三');

2. Post-middleware

🎜Post-middleware signifie que le code middleware commence à être exécuté une fois la requête http terminée. 🎜
Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '张三');
🎜🎜 3. Middleware d'enregistrement 🎜🎜

🎜1. Middleware de routage🎜

🎜Comme son nom l'indique, ce middleware ne sera appelé que sous un certain itinéraire. Autrement dit, lorsque l'utilisateur accède à ce lien de route, ce middleware sera exécuté. 🎜
Route::rule('login','index/user/login')->middleware(['Auth:张三', 'Check:李四']);
🎜 Ou utilisez le nom complet de la classe middleware : 🎜
<?php
namespace app\http\middleware;

class Auth
{
    public function handle($request, \Closure $next)
    {
        //给控制器传参数
        $request->result = '验证成功';       
        return $next($request);
    }
}
🎜 Remarque : Il est recommandé d'utiliser le nom complet de la classe pour l'enregistrement du middleware, sinon spécifié L'espace de noms utilise apphttpmiddleware comme espace de noms par défaut🎜
🎜La même route prend également en charge l'enregistrement de plusieurs middlewares, séparez-les simplement par des virgules dans middleware():🎜
public function index(Request $request)
{
	return $request->result;
}
🎜Thinkphp5 Après la version .1.8 +, l'enregistrement middleware pour les groupes de routage est pris en charge, comme suit : 🎜rrreee

2. Middleware global

🎜Cela signifie que toutes les demandes d'accès http (globales) appelleront automatiquement ce middleware. 🎜🎜Créez le fichier middleware.php dans le répertoire de l'application, le code est le suivant : 🎜rrreee

3. Intergiciel de module

🎜Thinkphp5.1.8+ version ou supérieure Prend en charge la définition du middleware du module Vous pouvez ajouter le fichier middleware.php directement sous le répertoire du module. La méthode de définition est la même que celle de . définition globale du middleware , mais cela ne prendra effet que sous ce module. 🎜

4. Le middleware du contrôleur

🎜Thinkphp5.1.17+ et supérieur prend en charge la définition du middleware pour les contrôleurs. Tout d'abord, votre contrôleur doit hériter de la classe thinkController du système, puis définir l'attribut middleware dans le contrôleur, par exemple : 🎜rrreee

5. Utilisez des fermetures pour définir un middleware

🎜Dans certaines situations simples, nous n'avons pas besoin d'utiliser des classes de middleware. Dans ce cas, les fermetures peuvent être utilisées pour définir le middleware, mais la fermeture la fonction doit Renvoie une instance d'objet Réponse. 🎜rrreee🎜🎜 4. Passer les paramètres au middleware 🎜🎜🎜🎜 1. Passer les paramètres au middleware global 🎜🎜
<?php
return [
	[\app\http\middleware\Auth::class, &#39;张三&#39;],
    &#39;Check:李四&#39;,
];

上面的定义表示给Auth中间件传入参数为张三,给Check中间件传入参数为李四

2、路由中间件传参数

(1)、给Auth中间件传入参数张三

Route::rule(&#39;login&#39;,&#39;index/User/login&#39;)->middleware('Auth:张三');

 也可以这样写:

Route::rule('login','index/User/login')->middleware(Auth::class, '张三');

(2)、给多个中间件传入同一个参数 

Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '张三');

(3)、单独指定各个中间件的参数

Route::rule('login','index/user/login')->middleware(['Auth:张三', 'Check:李四']);

五、中间件向控制器传参数

前面讲的给中间件传入特定的参数 (常量),那么中间要如何向控制器传入参数呢?我们可以通过给Request请求对象赋值的方式传参给控制器(或者其它地方),例如:

<?php
namespace app\http\middleware;

class Auth
{
    public function handle($request, \Closure $next)
    {
        //给控制器传参数
        $request->result = '验证成功';       
        return $next($request);
    }
}

需要特别注意:传递的变量名称不要和Request已有的参数变量名有冲突,比如用户登录请求的Request参数里已经有一个username,那么中间件向控制器传参,就不能再用这个username了,否则会改变原来参数的值。

然后在控制器的方法里面可以直接使用:

public function index(Request $request)
{
	return $request->result;
}

推荐学习:《PHP视频教程

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer