Erfahren Sie in einem Artikel mehr über die Middleware von ThinkPHP6.0

爱喝马黛茶的安东尼
Freigeben: 2019-12-16 13:22:20
nach vorne
7544 Leute haben es durchsucht

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',
];
Nach dem Login kopieren

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

generiert automatisch eine appmiddlewareTest-Middleware-Klasse mit dem folgenden Inhalt:

<?php
namespace app\middleware;
class Test
{
    public function handle($request, \Closure $next)
    {
    }
}
Nach dem Login kopieren

unterstützt auch die Erstellung von Middleware-Klassen durch Angabe des vollständigen Namespace

php think make:middleware app\middleware\Hello
Nach dem Login kopieren

Wir fügen eine Testausgabe hinzu

<?php
namespace app\middleware;
class Test
{
    public function handle($request, \Closure $next)
    {
    echo &#39;Before Middleware<br/>&#39;;
    $response = $next($request);
    echo &#39;After Middleware<br/>&#39;;
    return $response;
    }
}
Nach dem Login kopieren

Der Rückgabewert der Middleware-Handle-Methode muss ein Response-Objekt sein.

Fügen Sie dann

return [
\app\middleware\Test::class,
];
Nach dem Login kopieren

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 &#39;Hello,ThinkPHP!<br/>&#39;;
    }
}
Nach dem Login kopieren

Die Ausgabe des Zugriffs auf die Aktionsmethode ist

Before Middleware
Hello,ThinkPHP!
After Middleware
Nach dem Login kopieren

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(&#39;hello/:name&#39;,&#39;index/hello&#39;)
    ->middleware(\app\middleware\Hello::class);
Nach dem Login kopieren

Sie können Middleware für Routinggruppen definieren

Route::group(function(){
Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;);
//...
})->middleware(\app\middleware\Hello::class);
Nach dem Login kopieren

Wenn Sie mehrere Middleware ausführen möchten, können Sie

Route::group(function(){
Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;);
//...
})->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]);
Nach dem Login kopieren

Für häufig verwendete Middleware können wir eine definieren Alias, legen Sie in der Konfigurationsdatei configmiddleware.php die Routendefinition

return [
&#39;hello&#39;=>\app\middleware\Hello::class,
&#39;check&#39;=>\app\middleware\Check::class,
];
Nach dem Login kopieren

fest, die wie folgt geändert werden kann:

Route::group(function(){
Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;);
//...
})->middleware([&#39;hello&#39;,&#39;check&#39;]);
Nach dem Login kopieren

Unterstützt die Definition von Aliasen für eine Gruppe von Middlewares.

return [
&#39;test&#39;=>[\app\middleware\Hello::class,\app\middleware\Check::class],
];
Nach dem Login kopieren

Die Routendefinition kann geändert werden geändert werden Die

Route::group(function(){
Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;);
//...
})->middleware(&#39;test&#39;);
Nach dem Login kopieren

-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 = &#39;&#39;)
    {
    echo &#39;Hello&#39;. $name . &#39;<br/>&#39;;
    return $next($request);
    }
}
Nach dem Login kopieren

kann den Namensparameter im zweiten Parameter der Routing-Middleware übergeben, mit Ausnahme von

Route::get(&#39;hello/:name&#39;,&#39;index/hello&#39;)
    ->middleware(&#39;hello&#39;, &#39;middleware&#39;);
Nach dem Login kopieren

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 = [&#39;hello&#39;,&#39;check&#39;];
    public function index()
    {
    return &#39;Hello,ThinkPHP!<br/>&#39;;
    }
}
Nach dem Login kopieren

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 = [
&#39;hello&#39; => [&#39;only&#39;  => [&#39;hello&#39;]],
&#39;check&#39; => [&#39;except&#39;=> [&#39;hello&#39;]],
];
    public function hello()
    {
    return &#39;Hello,ThinkPHP!<br/>&#39;;
    }
    public function check()
    {
    return &#39;this action require check!<br/>&#39;;
    }    
}
Nach dem Login kopieren

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 = &#39;ThinkPHP&#39;;
        
        return $next($request);
    }
}
Nach dem Login kopieren

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

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!

Verwandte Etiketten:
Quelle:thinkphp.cn
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
Beliebte Tutorials
Mehr>
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!