Heim > PHP-Framework > Denken Sie an PHP > Thinkphp5.1 erklärt die Verwendung von Middleware ausführlich

Thinkphp5.1 erklärt die Verwendung von Middleware ausführlich

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2022-04-24 11:56:10
nach vorne
4224 Leute haben es durchsucht

Dieser Artikel vermittelt Ihnen relevantes Wissen über thinkphp, der hauptsächlich die Verwendung von Middleware vorstellt, einschließlich Pre-Middleware, Post-Middleware, Routing-Middleware und globaler Middleware. Schauen wir uns den relevanten Inhalt unten an, ich hoffe es wird für alle hilfreich sein.

Thinkphp5.1 erklärt die Verwendung von Middleware ausführlich

Empfohlene Studie: „PHP-Video-Tutorial

1. Die Rolle der Middleware

Middleware wird hauptsächlich verwendet, um die HTTP-Anfrage der Anwendung abzufangen oder zu filtern und auszuführen notwendige Geschäftsabwicklung. Mithilfe von Middleware kann beispielsweise überprüft werden, ob die Anfrageinformationen des Benutzers einen Ein-Satz-Trojaner enthalten. HTTP请求,并进行必要的业务处理。比如可以使用中间件来检查用户的请求信息里是否包含一句话木马。

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

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

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

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

二、定义中间件

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

php think make:middleware Check
Nach dem Login kopieren

 这个指令会 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对象
    }
}
Nach dem Login kopieren

 中间件说明:

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

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

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

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

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

    return $next($request);
}
Nach dem Login kopieren

1、前置中间件

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

<?php

namespace app\http\middleware;

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

2、后置中间件

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

<?php

namespace app\http\middleware;

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

三、注册中间件

1、路由中间件

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

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

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

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

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

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

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

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

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

2、全局中间件

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

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

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

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;;
    }
}
Nach dem Login kopieren

5、使用闭包定义中间件

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

Der Unterschied zwischen Verhaltens-Hooks und Middleware:

Middleware: Es Wenn ein Benutzer auf unser Projekt zugreift, kann die Middleware feststellen, ob der Benutzer die Berechtigung für diese Anfrage hat oder ob der Benutzer einen illegalen Zugriff hat. span>: Eine Methode, die ausgelöst wird, wenn eine Aktion beginnt oder endet, z. B. die Protokollierung einer erfolgreichen Benutzerregistrierung.

Middleware verarbeitet Benutzeranfragen, während Hooks Benutzeraktionen verarbeiten. Middleware entspricht einem Filter und Hooks entsprechen Ereignissen , die beide AOP-Ideen übernehmen.

2. Definieren Sie Middleware

🎜🎜Zuerst können Sie Middleware schnell über den cmd-Befehlszeilenbefehl generieren. Führen Sie den folgenden cmd-Befehl im Stammverzeichnis des Projekts aus: 🎜
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);
});
Nach dem Login kopieren
🎜 Dieser Befehl wird application/ Eine <code>Check-Middleware wird im Verzeichnis http/middleware generiert. Der Code lautet wie folgt: 🎜
<?php
return [
	[\app\http\middleware\Auth::class, &#39;张三&#39;],
    &#39;Check:李四&#39;,
];
Nach dem Login kopieren
Nach dem Login kopieren
🎜 Middleware Beschreibung: 🎜🎜1. Die Eingabeausführungsmethode der Middleware muss die Methode handle sein, und der erste Parameter ist das Objekt Request und der zweite Parameter ein Abschluss; 🎜🎜 2. Der Rückgabewert der Middleware-handle-Methode muss ein Response-Objekt sein 🎜🎜3. Das Request-Objekt kann direkt in der Middleware verwendet werden Erhalten Sie die Anforderungsparameter. 🎜🎜4. Unter bestimmten Voraussetzungen können Sie den dritten Parameter verwenden, um zusätzliche Parameter zu übergeben. E7%BD%AE%E4 %B8%AD%E9%97%B4%E4%BB%B6%EF%BC%9A">1. Pre-Middleware🎜Pre-Middleware bedeutet das vor der http-Anfrage Ist abgeschlossen, führen Sie den Middleware-Code aus. 🎜
Route::rule(&#39;login&#39;,&#39;index/User/login&#39;)->middleware('Auth:张三');
Nach dem Login kopieren
Nach dem Login kopieren

2. Post-Middleware

🎜Post-Middleware bedeutet, dass die Ausführung des Middleware-Codes beginnt, nachdem die http-Anfrage abgeschlossen ist. 🎜
Route::rule('login','index/User/login')->middleware(Auth::class, '张三');
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜 3. Registrierungs-Middleware 🎜🎜

🎜1. Routing-Middleware🎜

🎜Wie der Name schon sagt, ist diese Middleware so spezifiziert, dass sie unter einer bestimmten Route aufgerufen wird. Das heißt, wenn der Benutzer auf diesen Routenlink zugreift, wird diese Middleware ausgeführt. 🎜
Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '张三');
Nach dem Login kopieren
Nach dem Login kopieren
🎜 Oder verwenden Sie den vollständigen Klassennamen der Middleware: 🎜
Route::rule('login','index/user/login')->middleware(['Auth:张三', 'Check:李四']);
Nach dem Login kopieren
Nach dem Login kopieren
🎜 Hinweis: Es wird empfohlen, den vollständigen Klassennamen für die Middleware-Registrierung zu verwenden, falls nicht angegeben Der Namespace verwendet standardmäßig apphttpmiddleware als Namespace🎜
🎜Die gleiche Route unterstützt auch die Registrierung mehrerer Middlewares, trennen Sie diese einfach durch Kommas in middleware():🎜
<?php
namespace app\http\middleware;

class Auth
{
    public function handle($request, \Closure $next)
    {
        //给控制器传参数
        $request->result = '验证成功';       
        return $next($request);
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Thinkphp5 Nach Version .1.8 +, Middleware-Registrierung für Routinggruppen wird wie folgt unterstützt: 🎜
public function index(Request $request)
{
	return $request->result;
}
Nach dem Login kopieren
Nach dem Login kopieren

2. Globale Middleware

🎜Das bedeutet, dass alle (globalen) HTTP-Zugriffsanfragen diese Middleware automatisch aufrufen. 🎜🎜Erstellen Sie die Datei middleware.php im Anwendungsverzeichnis. Der Code lautet wie folgt: 🎜rrreee

3. Modul-Middleware

🎜Thinkphp5.1.8+ Version oder höher Unterstützt die Modul-Middleware-Definition. Sie können die Datei middleware.php direkt im Modulverzeichnis hinzufügen. Die Definitionsmethode ist die gleiche wie bei globale Middleware-Definition, wird jedoch nur unter diesem Modul wirksam. 🎜

4. Controller-Middleware

🎜Thinkphp5.1.17+ und höher unterstützt die Definition von Middleware für Controller. Zuerst muss Ihr Controller die Klasse thinkController des Systems erben und dann das Attribut middleware im Controller definieren, zum Beispiel: 🎜rrreee

5. Verwenden Sie Abschlüsse, um Middleware zu definieren

🎜In einigen einfachen Situationen müssen wir keine Middleware-Klassen verwenden. In diesem Fall können Abschlüsse zum Definieren von Middleware verwendet werden, aber der Abschluss Die Funktion muss eine Response-Objektinstanz zurückgeben. 🎜rrreee🎜🎜 4. Parameter an die Middleware übergeben 🎜🎜🎜🎜 1. Parameter an die globale Middleware übergeben 🎜🎜
<?php
return [
	[\app\http\middleware\Auth::class, &#39;张三&#39;],
    &#39;Check:李四&#39;,
];
Nach dem Login kopieren
Nach dem Login kopieren

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

2、路由中间件传参数

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

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

 也可以这样写:

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

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

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

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

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

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

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

<?php
namespace app\http\middleware;

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

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

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

public function index(Request $request)
{
	return $request->result;
}
Nach dem Login kopieren
Nach dem Login kopieren

推荐学习:《PHP视频教程

Das obige ist der detaillierte Inhalt vonThinkphp5.1 erklärt die Verwendung von Middleware ausführlich. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Aktuelle Ausgaben
ThinkPHP Warum Composer verwenden?
Aus 1970-01-01 08:00:00
0
0
0
thinkphp-Dateien hochladen
Aus 1970-01-01 08:00:00
0
0
0
Wie nennt Thinkphp PHP-Erweiterungen?
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage