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

WBOY
Freigeben: 2022-04-24 11:56:10
nach vorne
4019 Leute haben es durchsucht

Dieser Artikel vermittelt Ihnen relevantes Wissen überthinkphp, 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 dieHTTP-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中间件,代码如下:

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请求完成之前,先执行中间件的代码。


        
Nach dem Login kopieren

2、后置中间件

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


        
Nach dem Login kopieren

三、注册中间件

1、路由中间件

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

//用户登录的路由 Route::rule('login','index/User/login')->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文件,代码如下:


        
Nach dem Login kopieren

3、模块中间件

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

4、控制器中间件

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


        
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('hello', function(){ Route::rule('login','index/User/login'); })->middleware(function($request,\Closure $next){ if ($request->param('name') == 'index') { return redirect('/');//重定向到首页 } return $next($request); });
Nach dem Login kopieren
Dieser Befehl wird application/ Eine Check-Middleware wird im Verzeichnis http/middlewaregeneriert. Der Code lautet wie folgt:

         
Nach dem Login kopieren
Nach dem Login kopieren
Middleware Beschreibung:1. Die Eingabeausführungsmethode der Middleware muss die Methode handlesein, und der erste Parameter ist das Objekt Requestund 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-MiddlewarePre-Middleware bedeutet das vor der http-Anfrage Ist abgeschlossen, führen Sie den Middleware-Code aus.
Route::rule('login','index/User/login')->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 apphttpmiddlewareals Namespace
Die gleiche Route unterstützt auch die Registrierung mehrerer Middlewares, trennen Sie diese einfach durch Kommas in middleware():
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.phpim 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.phpdirekt 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 KlassethinkControllerdes Systems erben und dann das Attributmiddlewareim 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 eineResponse-Objektinstanz zurückgeben. rrreee 4. Parameter an die Middleware übergeben 1. Parameter an die globale Middleware übergeben

           
Nach dem Login kopieren
Nach dem Login kopieren

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

2、路由中间件传参数

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

Route::rule('login','index/User/login')->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请求对象赋值的方式传参给控制器(或者其它地方),例如:

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
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!