Heim > Artikel > PHP-Framework > Erfahren Sie in einem Artikel mehr über die Middleware von ThinkPHP6.0
ThinkPHP6.0-Middleware ist in System-Middleware und Anwendungs-Middleware unterteilt. System-Middleware ist die im Kern-Framework integrierte Middleware, und Anwendungs-Middleware ist die in der Anwendung erstellte Middleware.
Die Hauptanwendungsszenarien von Middleware können Datenfilterung, Berechtigungserkennung, Anforderungsabfangen und andere Verhaltensweisen für HTTP-Anforderungen umfassen. Die Verwendung von Middleware kann die Definition des Controllers vereinfachen und viele zusätzliche nicht zum Kerngeschäft gehörende Geschäftsprozesse verarbeiten kann zur Ausführung an die Middleware übergeben werden.
Aus Sicht des Einsatzbereichs der Middleware kann sie in globale Middleware, Anwendungs-Middleware, Controller-Middleware und Routing-Middleware unterteilt werden.
Globale Middleware
Globale Middleware ist die in appmiddleware.php definierte Middleware, die jedoch nur für unterstützte System-Middleware aktiviert ist Sie müssen den Kommentar entfernen, um die entsprechende System-Middleware zu verwenden. Der Standardinhalt lautet wie folgt:
return [ // 全局请求缓存 // 'think\middleware\CheckRequestCache', // 多语言加载 // 'think\middleware\LoadLangPack', // Session初始化 // 'think\middleware\SessionInit', // 页面Trace调试 // 'think\middleware\TraceDebug', ];
Einige Funktionen des Systems werden zur einheitlichen Verwaltung an die Middleware übergeben, einschließlich globaler Anforderungszwischenspeicherung und automatischer Erkennung mehrerer Sprachen. Und Laden, Sitzungsinitialisierung und Seitenverfolgungsdebuggen, das heißt, die standardmäßig installierte Anwendung unterstützt keine Sitzung. Sie müssen die Sitzungsinitialisierungs-Middleware global aktivieren, bevor Sitzung wirksam werden kann. Für API-Anwendungen ist die Unterstützung der Sitzungsfunktion nicht erforderlich.
Sie können Ihre Anwendungs-Middleware in der globalen Middleware-Definitionsdatei hinzufügen, aber stellen Sie sicher, dass die System-Middleware zuerst ausgeführt wird. Die Middleware-Definition muss den vollständigen Klassennamen verwenden, der schnell über die Befehlszeile erstellt werden kann Anweisungen. Eine Anwendungs-Middleware:
php think make:middleware Test
generiert automatisch eine appmiddlewareTest-Middleware-Klasse mit dem folgenden Inhalt:
<?php namespace app\middleware; class Test { public function handle($request, \Closure $next) { } }
unterstützt auch die Erstellung von Middleware-Klassen durch Angabe des vollständigen Namespace
php think make:middleware app\middleware\Hello
Wir fügen eine Testausgabe hinzu
<?php namespace app\middleware; class Test { public function handle($request, \Closure $next) { echo 'Before Middleware<br/>'; $response = $next($request); echo 'After Middleware<br/>'; return $response; } }
Der Rückgabewert der Middleware-Handle-Methode muss ein Response-Objekt sein.
Fügen Sie dann
return [ \app\middleware\Test::class, ];
in die globale Middleware-Definition ein. Angenommen, die Controller-Methode, auf die wir zugreifen möchten, ist
<?php namespace app\controller; class Index { public function hello() { return 'Hello,ThinkPHP!<br/>'; } }
Die Ausgabe des Zugriffs auf die Aktionsmethode ist
Before Middleware Hello,ThinkPHP! After Middleware
Sie können den Ausführungsprozess der Middleware sehen, der in Prä-Middleware und Post-Middleware unterteilt werden kann. Dies ist bei der Fall oben Test-Middleware. Der Code vor $next($request) gehört zur Prä-Middleware-Kategorie und der Code danach gehört zur Post-Middleware-Kategorie.
Anwendungs-Middleware
Wenn es sich um einen Multianwendungsmodus handelt, ist die Anwendungs-Middleware die im App-Anwendungsnamen middleware.php definierte Middleware und wird nur verwendet in dieser Anwendung Es ist unter den folgenden Bedingungen gültig und das Definitionsformat ist dasselbe wie das der globalen Middleware.
Routing-Middleware
Routing-Middleware bedeutet, dass eine bestimmte Middleware erst ausgeführt wird, nachdem die Route übereinstimmt. Sie wird z. B. mithilfe der Middleware-Methode in der Routendefinition definiert Beispiel:
Route::get('hello/:name','index/hello') ->middleware(\app\middleware\Hello::class);
Sie können Middleware für Routinggruppen definieren
Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware(\app\middleware\Hello::class);
Wenn Sie mehrere Middleware ausführen möchten, können Sie
Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]);
Für häufig verwendete Middleware können wir eine definieren Alias, legen Sie in der Konfigurationsdatei configmiddleware.php die Routendefinition
return [ 'hello'=>\app\middleware\Hello::class, 'check'=>\app\middleware\Check::class, ];
fest, die wie folgt geändert werden kann:
Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware(['hello','check']);
Unterstützt die Definition von Aliasen für eine Gruppe von Middlewares.
return [ 'test'=>[\app\middleware\Hello::class,\app\middleware\Check::class], ];
Die Routendefinition kann geändert werden geändert werden Die
Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware('test');
-Middleware unterstützt die Übergabe eines Parameters. Die Middleware ist wie folgt definiert:
<?php namespace app\middleware; class Hello { public function handle($request, \Closure $next, string $name = '') { echo 'Hello'. $name . '<br/>'; return $next($request); } }
kann den Namensparameter im zweiten Parameter der Routing-Middleware übergeben, mit Ausnahme von
Route::get('hello/:name','index/hello') ->middleware('hello', 'middleware');
Zusätzlich zu den unterstützenden Parametern können Sie die Abhängigkeitsinjektion in der Handle-Methode der Middleware verwenden.
Controller-Middleware
Controller-Middleware wird nur wirksam, wenn auf einen bestimmten Controller zugegriffen wird
<?php namespace app\controller; class Hello { protected $middleware = ['hello','check']; public function index() { return 'Hello,ThinkPHP!<br/>'; } }
Da die Middleware zuvor als Aliase definiert wurde, verwenden Sie daher den Alias Geben Sie die Definition direkt hier ein, andernfalls müssen Sie die vollständige Namespace-Definition verwenden.
Standardmäßig wird jede im Controller definierte Betriebsmethode ausgeführt. Manchmal möchten Sie nicht, dass alle Vorgänge die Middleware des Controllers ausführen müssen . Ausführungsfilterung von Dateien.
<?php namespace app\controller; class Index { protected $middleware = [ 'hello' => ['only' => ['hello']], 'check' => ['except'=> ['hello']], ]; public function hello() { return 'Hello,ThinkPHP!<br/>'; } public function check() { return 'this action require check!<br/>'; } }
Die Hallo-Middleware wird nur ausgeführt, wenn die Hallo-Operation des Index-Controllers ausgeführt wird, während die Prüf-Middleware mit Ausnahme der Hallo-Methode ausgeführt wird. Sie können den spezifischen Effekt tatsächlich testen.
Middleware-Übergabe von Parametern
Es gibt viele Möglichkeiten, Parameter zwischen Middleware und Controller zu übergeben. Eine einfache Methode ist die Verwendung von Request zur Übergabe von Parametern.
<?php namespace app\middleware; class Hello { public function handle($request, \Closure $next) { $request->hello = 'ThinkPHP'; return $next($request); } }
Die Übergabe der Parameter durch die Middleware an den Controller muss in der Front-End-Middleware abgeschlossen werden. Der Controller kann die von der Post-Middleware an den Controller übergebenen Parameter nicht empfangen.
Dann können Sie es direkt in der Controller-Methode verwenden
public function index(Request $request) { return $request->hello; // ThinkPHP }
Es gibt viele ThinkPHP-TutorialsVideos, alle auf der chinesischen PHP-Website, herzlich willkommen, online zu lernen!
Dieser Artikel wurde reproduziert von: https://www.php.cn/phpkj/thinkphp/
Das obige ist der detaillierte Inhalt vonErfahren Sie in einem Artikel mehr über die Middleware von ThinkPHP6.0. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!