Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?
咔咔
Freigeben: 2020-12-29 11:59:46
Original
2071 Leute haben es durchsucht
1. Führen Sie die Methode im Controller aus
Die Anforderungsadresse dieses Artikels ist der konfigurierte Domänenname.
Anforderungsadresse
Sie können aus dem Obigen wissenDer Wert von $instance ist Instanz von appindexcontrollerIndex. $instance的值就是appindexcontrollerIndex的实例。
这块也是存在中间件的概念,依然如此中间件会在后文中单独提到,这里不做解释。
在这里$this->app['middleware']->controller
Dies gilt auch für das Konzept der Middleware. Die Middleware wird im folgenden Artikel separat erwähnt und hier nicht erläutert. HereHier verwenden wir die Form des Array-Zugriffs, um auf das Objekt zuzugreifen, also verwenden wir die Form von ArrayAccess. Die beiden Konzepte müssen klar unterschieden werden. 🎜🎜🎜Führen Sie die Controller-Methode durch Reflektion aus
Dann wird der Methodenname abgerufen. Um den Methodennamen zu erhalten, müssen Sie nur wissen, dass der zurückgegebene Wert lautet index即可。
Was Sie hier beachten müssen, ist diese Codezeile$ this->rule->getConfig('action_suffix'), was hier erhalten wird, ist das Suffix der Operationsmethode.
Operationsmethoden-SuffixWie würde es aussehen, wenn wir jetzt einen Wert für dieses Operationsmethoden-Suffix festlegen würden! Fügen Sie einen Kaka-Wert hinzu und greifen Sie darauf zu, um zu sehen, wie das Ergebnis aussehen wird.
🎜Kaka zum Testen hinzugefügt
Beim Zugriff wird angezeigt, dass die Indexkaka-Methode nicht vorhanden ist. Dies bedeutet, dass dieser Parameter an alle Methodennamen angehängt wird.
Zugriffsergebnisse
Nachdem die Erweiterung des Codes zum Erhalten des aktuellen Operationsnamens abgeschlossen ist, ist der nächste Schritt if (is_callable([$instance, $action])) {, hier können Sie unseren alten Freund sehenis_callable. if (is_callable([$instance, $action])) {,在这里可以看见我们的老朋友is_callable。
Sie kennen die beiden Parameter von is_callable hier aus dem Obigen. Der erste Parameter ist Instanz von appindexcontrollerIndex, der zweite Parameter ist index führt die Operationsmethode aus. 🎜
ThenindexOb der Methodenname ausgeführt werden kann. is_callable的作用就是检测在appindexcontrollerIndex类中的index方法名是否可以执行。
很明显这里会返回一个true,因为在index类里边存在index方法的。
这里在做测试之前一定要把刚刚在app的配置文件中配置的方法名后缀那个给取消掉。
通过这个is_callable
Natürlich wird hier ein true zurückgegeben, da es in der Indexklasse eine Indexmethode gibt.
Bevor Sie den Test hier durchführen, müssen Sie das soeben in der App-Konfigurationsdatei konfigurierte Methodennamensuffix löschen.
Through this , 0.05); Schriftfamilie: „Operator Mono“, Consolas, Monaco, Monospace; > bestimmt, ob es drei Situationen geben wird, Kaka wird sie unter drei Gesichtspunkten analysieren. 🎜🎜🎜Die erste Situation: Es gibt eine ausführbare Methode in der Klasse🎜🎜🔜 Es sind keine Parameter festgelegt, daher ist
am Ende ein leeres Array.
Um diesen Code mit Parametern zu testen, müssen wir eine kleine Änderung an der Routing-Adresse vornehmen.
Teil des Codes testen
Das Routing wurde vorher nicht verwendet, aber die Standardadresse wurde direkt verwendet.
$vars Verwenden Sie die neue Routing-Adresse zum Testen
Verwendung Wenn Sie die Daten dieser Routing-Adresse ausdrucken, können Sie sehen, dass es sich um die von uns festgelegten Routing-Parameter handelt.
Datendruck
Diese Methode zum Abrufen von Anforderungsvariablen gibt Folgendes ein: $this->request->param();Diese Codezeile$this->request->param();这行代码
Wie das Framework Parameter erhält🎜🎜Zugriffsadresse: http://www.source.com/index.php/hello/hello🎜🎜Wie wir oben wissen, erfolgt dies über $this->request->param() um die Parameter zu erhalten, Wie erhält man also die Parameter im Framework? 🎜🎜Gemäß dem Prozesscode wird die entsprechende Methode verwendet, um die Parameter gemäß der erhaltenen Anforderungsmethode abzurufen. Hier muss klargestellt werden, dass wir die Get-Anfrage verwenden. 🎜🎜Der Code wird also so ausgeführt: Da Kaka Anfragen über Routing stellt, kapselt das Framework hier speziell einen Anfrageparameter für das Routing.
Rufen Sie die Parameter der aktuellen Anfrage ab
Kommen Sie dazuroute-Methode. Wenn Sie die Kommentare sehen, werden Sie verstehen, dass sie zum Abrufen von Routing-Parametern verwendet wird, Sie müssen jedoch noch die Eingabeebene eingeben. route方法,看到注释就明白是用来获取路由参数的,但是还是需要在进入一层到input。
获取路由参数
在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。
设置路由变量
所以说$this->route
🎜🎜🎜 Routing-Parameter abrufen🎜🎜🎜Im vorherigen Artikel zum Routing werden die Parameter beim Abrufen der Routing-Parameter mit dem Routenattribut der Anforderung zusammengeführt. 🎜🎜🎜🎜🎜 Routing-Variablen festlegen🎜🎜🎜So sayErgebnisse drucken
Zu diesem Zeitpunkt wird der Ausführungsprozess ausgeführt, um Variablen zu erhalten, die Filterung und Standardwerte unterstützen. Im obigen $this->routeDer übergebene Parameter ist falsch, daher wird dieser Block direkt zurückgegeben. $this->route穿进来的参数是false,所以说这块会直接返回。
获取变量 支持过滤和默认值
这里返回的结果会返回给上文我们开始解析的地方,也就是说这个$vars
Das Abrufen von Variablen unterstützt Filterung und Standardwerte Die hier zurückgegebenen Ergebnisse werden an die Stelle zurückgegeben, an der wir oben mit der Analyse begonnen haben, d. h. an diesen $vars sind die erhaltenen Routing-Parameter.
🎜Zurückgegebene Routing-Parameter-Ergebnisse🎜🎜🎜🎜Zweiter Fall: Es gibt keine ausführbare Methode in der Klasse🎜🎜
Wenn das erste Urteil ausgeführt wirdis_callable判断类里边的方法不可执行时,就会执行到第二种情况。
第二种执行情况
先来请求的一个没有设置的路由地址,看会返回什么。
错误返回
根据代码给的提示,我们来到index控制器建立一个_empty
Die zweite AusführungssituationFordern Sie zunächst eine nicht festgelegte Routing-Adresse an und sehen Sie, was zurückgegeben wird.
🎜🎜Fehlerrückgabe🎜Gemäß den Anweisungen des Codes kommen wir zum Index-Controller, um einen _empty Methode, und fordern Sie es dann einmal an und sehen Sie, was passiert. 🎜🎜🎜🎜Stellen Sie die _empty-Methode im Controller ein
Sie können den Druckergebnissen entnehmen, dass diese Methode ausgeführt wird, wenn die Methode, auf die zugegriffen wird, nicht vorhanden ist_empty.
Ergebnisse drucken
Wie wird diese Methode ausgeführt? Diese Ausführungsmethode wird durch die Verwendung des Reflexionsmechanismus erreicht. Es wurde bereits ein Artikel zur Erläuterung der Reflexion von Kaka veröffentlicht, Sie müssen das Dokument jedoch noch lesen und anzeigen.
Der dritte Fall: Es gibt keine ausführbare Methode oder _empty-Methode in der Klasse
Dieser Fall ist relativ einfach, er gibt nur die Fehlermeldung direkt zurück. Apropos.
Die dritte Situation
Nach der Ausführung der drei Situationen
Nach der Analyse der drei Situationen wird am Ende die statistische Methode implementiert.
Die Methode zum Aufrufen der Reflexionsausführungsklasse unterstützt die Parameterbindung, was bedeutet, dass der Abschlussausführungsprozess hier abgeschlossen ist.
Zu den nachfolgenden automatischen Anfragen werden Einzelheiten in Abschnitt 5 erläutert.
Statistische Ausführung
2. So instanziieren Sie den Controller mit der Routing-Adresse
Im vorherigen Abschnitt haben wir das Routing für drei oder vier Perioden erklärt, und die letzte Erklärung finden Sie hier: Wie führt man dann das festgelegte Routing aus?
Verwenden Sie diese Route als Nächstes als Fall
Fallroute
Erinnern Sie sich noch an den Rückgabewert, wenn Sie die Routenerkennung starten? Bitte schauen Sie sich das Bild unten an.
Routenerkennung Jetzt zu sagen ist wird verwendet, um beim Zugriff auf nicht vorhandene Eigenschaften die magische Methode der Containerklasse auszuführen und schließlich eine Instanz über den Container zurückzugeben. <p></p>
<p data-tool="mdnice编辑器" style="margin-top: 0.8em; margin-bottom: 0.8em; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: padding-top: padding-bottom: line-height:>Der Code wird also an der Position im Bild unten ausgeführt und legt die Planungsinformationen der aktuellen Anfrage fest oder ruft sie ab Drucken Sie es hier auf der Controller-Instanziierung aus. Der zurückgegebene Wert ist </p>. Dieser Wert wird im Controller festgelegt. Gehen Sie dann zum Controller, um ihn zu überprüfen. <p><img src="https://img.php.cn/upload/image/289/674/133/1609211442972794.png" title="1609211442972794.png" alt="Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?"></p>
<figure data-tool="mdnice编辑器" style="color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: margin: display: flex flex-direction: column justify-content: center align-items: border-radius: overflow: hidden><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;"></figcaption>Daten drucken</figure><p data-tool="mdnice编辑器" style="margin-top: 0.8em; margin-bottom: 0.8em; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: padding-top: padding-bottom: line-height:><code style="font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; background-color: rgba(27, 31, 35, 0.05); font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb>indexGehen Sie zur Init-Methode, um das Ergebnis auszudrucken und die Ergebnisse anzuzeigen. Verwenden Sie dazu die Routing-Adresse.
Daten drucken
Es wird keine Routing-Adresse verwendet
Wissen Sie, warum sich der Wert hier geändert hat?
Der oben gedruckte Wert ist das Bild unten, warum ist es hier das Bild oben!
Ergebnisse drucken
Der letzte Schritt im Routing-Abschnitt besteht darin, die Routing-Planung zu initiieren und schließlich eine Routing-zu-Modul-/Controller-/Betriebsmethode aufzurufen.
Routing-Planung
Diese MethodedispatchModuleinstanziiert schließlich eine Klasse. Als nächstes müssen wir diese Klasse eingehend studieren
Route zum Modul/Controller/Betrieb
Anhand der Codeverfolgung können Sie sehen, dass es sich tatsächlich um thinkroutedispatchModuleDiese KlassethinkroutedispatchModule这个类
🎜🎜 Klassenalias 🎜🎜🎜 kommtModule Klasse, Sie werden feststellen, dass es Dispatch class🎜
🎜🎜🎜Vererbung der Klasse 🎜🎜🎜 in thinkphp/library/think/route/Dispatch.phpIm Controller dieser Klasse finden Sie den
Variablenzuweisung
Lassen Sie uns zu diesem Zeitpunkt einen Blick zurück auf 路由到模块/控制器/操作Was sind die Parameter, die hier an die Methode übergeben werden, haha
Die Parameter, die an das Modul/die Steuerung/den Betrieb weitergeleitet werden
Am Ende wird der Wert also einfach in Form eines separaten Arrays gedruckt.
Instanziieren Sie den Controller
Dann ist die nächste Aktion dieselbe wie der Prozess, bei dem der Routing-Zugriff nicht verwendet wird, und es ist keine Analyse erforderlich.
Dies ist das Ende der Instanziierung der Routing-Adresse im Controller.
Über das Geben$this->app->controller传入的是index,返回的是整个类名,具体的实现过程就不去解析了,实现的方法是$this->parseModuleAndClass können Sie selbst recherchieren!
3. AutoResponse-Planung ausführen
Im vierten Abschnitt wird nur erwähnt, dass die Methode im Ausführungscontroller von der Stelle in der Abbildung unten zurückkehrt, aber wie die Rückkehr erfolgt, wird nicht im Detail erklärt.
Ich werde mir einen Moment Zeit nehmen, um zu erklären, wie es ausgeführt wird.
Automatische Anfrage
Die Zugriffsroutingadresse ist wie unten gezeigt. Sie können sehen, dass es sich bei den zurückgegebenen Daten um die Daten handelt, die im Controller zurückgegeben werden müssen.
Die vom Controller zurückgegebenen Daten
Der Wert der gedruckten Daten
Der gedruckte Wert ist wie im Bild unten dargestellt. Hier müssen Sie sich im Klaren sein! Das Lesen des Quellcodes erfordert ein wenig Recherche, und mit der Zeit werden Sie den Inhalt verstehen.
Standort drucken
Als nächstes führen wir eine eingehende Analyse $this->autoResponse($data); dieser Methode durch. Diese Methode bedeutet wörtlich automatische Reaktion.
Automatische Antwort
Wenn Sie die erste Zeile dieses Ausführungsprozesses$data instanceof Response nicht verstehen, können Sie sie nicht lesen.
Was Sie nicht wissen und nicht verstehen, muss noch gelöst werden. Lesen Sie einfach den Quellcode und erobern Sie ihn Stück für Stück, um zu gewinnen.
Über die Verwendung von „Instanceof“
Instanceof kann bestimmen, ob ein Objekt eine Instanz einer bestimmten Klasse ist und ob ein Objekt eine bestimmte Schnittstelle implementiert.
Als nächstes wird Kaka Ihnen ein einfaches Beispiel geben, um dies zu demonstrieren, und Sie werden verstehen, was vor sich geht.
Fall 1
Erstellen Sie zunächst zwei Klassen. Der Fall ist wie unten dargestellt.
Demonstrationsfall
Das Bild unten zeigt das Druckergebnis. Sie können sehen, dass der erste Fall „true“ und der zweite „false“ zurückgibt.
bestimmt, ob ein Objekt eine Instanz einer bestimmten Klasse ist, also eine Instanz von $instance就是类Test, und gibt daher true zurück.
Ergebnisse drucken
Fall zwei
Fall zwei unterscheidet sich von Fall eins. Eine Schnittstelle wird eingerichtet, und dann implementiert die Klasse die Schnittstelle.
Demonstrationsfall 2
Die endgültigen Rückgabeergebnisse sind alle wahr, was bedeutet, dass, wenn eine Klasse eine andere Schnittstelle implementiert, dies während der Beurteilung wahr ist.
Druckergebnis
Das Obige gilt für instanceof gibt zwei Demonstrationsfälle, deren Verständnis darin besteht, festzustellen, ob eine Instanz eine Instanz einer bestimmten Klasse ist. instanceof给出的俩种演示案例,对其理解就是判断一个实例是否为某个类的实例。
Gehen Sie dann zurück zum Text, Die erste besteht darin, den Antwortausgabetyp standardmäßig automatisch zu identifizieren. Dies dient dazu, festzustellen, ob es sich um eine Ajax-Anfrage handelt. Diesmal wartet die spezifische Implementierungsmethode darauf, dass KaKa den Framework-Quellcode analysiert, und benötigt dann jeden Tag etwas Zeit um einige Methoden des Frameworks zu überprüfen.
Die zweite Position besteht darin, die entsprechenden Konfigurationsinformationen aus der Konfigurationsdatei abzurufen. Sie betrachtet die Methode der Regelklasse, die ausgeführt wird, aber in der Methode befindet sich der Code, der ausgeführt wird, um die Konfigurationsinformationen zu erhalten.
Der erste Punkt im Ausführungsprozess des Codes
Dann müssen wir den dritten Teil analysieren, der oben nicht erwähnt wurde, nämlich den Code $response = Response::create($data, $type);$response = Response::create($data, $type);
come to classthinkphp/library/think/responseIn diesem Verzeichnis befindet sich kein HTML. 🎜
Der Code instanziiert diese Klasse also direkt und kehrt dann zurück.
Erstellen Sie ein Antwortobjekt
Wenn Sie zum Konstruktor dieser Klasse kommen, erledigen Sie hauptsächlich ein paar Dinge.
Weisen Sie den Rückgabewert dem Datenattribut dieser Klasse zu.
Legen Sie den Seitenausgabetyp fest.
Statuscode zurückgeben
Hier Bildbeschreibung einfügen
Dann weist der Code
dieser Variablen den Rückgabewert zu.
Fügen Sie abschließend diesen $response给返回出去,并且返回信息如下图打印结果。
在这里插入图片描述
打印出返回信息
然后代码依然会向上层返回,回到最初的闭包函数。
在咔咔圈出来的地方,下一行代码也是关于中间件,只需要知道最终返回结果跟上图打印的结果一样即可。
返回到中间级件那一层
最终返回结果回到thinkphp/library/think/route/Dispatch.php
Bildbeschreibung hier einfügen
Drucken Sie die Rückgabeinformationen aus 🎜Dann die Der Code kehrt weiterhin zur oberen Ebene zurück und kehrt zur ursprünglichen Abschlussfunktion zurück. 🎜🎜An der von Kaka eingekreisten Stelle geht es in der nächsten Codezeile auch um Middleware. Sie müssen nur wissen, dass das endgültige Rückgabeergebnis mit dem im Bild gedruckten Ergebnis übereinstimmt. 🎜🎜🎜Zurück zur Zwischenebene🎜Das Endergebnis wird an thinkphp/library/think/route/Dispatch.php, wir haben die Analyse von hier aus gestartet. 🎜🎜🎜🎜Hier Bildbeschreibung einfügen
Ergebnis zurückgeben an autoResponse($data);$data,然后在进行执行return $this->autoResponse($data);
你没看错,这里的代码熟悉吧!
这个时候返回的结果就是Response的实例,所以会直接返回$response
Sie haben richtig gelesen, der Code hier kommt Ihnen bekannt vor!
Das zu diesem Zeitpunkt zurückgegebene Ergebnis ist $response.
Automatische Antwort
🎜🎜Bis zu diesem Punkt wird die Methode im Controller ausgeführt und die Antwort analysiert. 🎜
Unabhängig davon, ob es sich um festgelegte Routing-Regeln oder um den direkten Zugriff über die Modul-Controller-Methode handelt, wird das Antwortergebnis letztendlich über die obige Methode zurückgegeben.
„
Beharrlichkeit beim Lernen, Beharrlichkeit beim Bloggen und Beharrlichkeit beim Teilen sind die Überzeugungen, die Kaka seit seiner Karriere vertritt. Ich hoffe, dass Kakas Artikel im riesigen Internet Ihnen ein wenig helfen können Kaka, wir sehen uns in der nächsten Ausgabe
“
Das obige ist der detaillierte Inhalt vonWie instanziiert die ThinkPHP-Routing-Adresse den Controller?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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