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.
Empfohlene Studie: „PHP-Video-Tutorial“
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
这个指令会application/http/middleware
目录下面生成一个Check
中间件,代码如下:
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); }Nach dem Login kopieren
前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。
Nach dem Login kopieren
后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。
Nach dem Login kopieren
顾名思义,就是指定在某个路由下才会去调用这个中间件,即用户访问了这个路由链接,就会执行这个中间件。
//用户登录的路由 Route::rule('login','index/User/login')->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');
意思就是说,所有的(全局)http访问请求,都会自动调用这个中间件。
在application目录下创建middleware.php文件,代码如下:
Nach dem Login kopieren
Thinkphp5.1.8+
版本以上支持模块中间件定义,你可以直接在模块目录下面增加middleware.php
文件,定义方式和全局中间件定义一样,只是只会在该模块下面生效。
Thinkphp5.1.17+
版本以上支持为控制器定义中间件。首先你的控制器需要继承系统的thinkController
类,然后在控制器中定义middleware
属性,例如:
Nach dem Login kopieren
在某些简单的场合,我们不需要使用中间件类,这时候可以使用闭包定义中间件,但闭包函数必须返回Response
Der Unterschied zwischen Verhaltens-Hooks und Middleware: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: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.
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); });
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
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-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
apphttpmiddleware
als 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.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 KlassethinkController
des Systems erben und dann das Attributmiddleware
im Controller definieren, zum Beispiel: rrreee5. 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!