Die Anforderungsadresse dieses Artikels ist der konfigurierte Domänenname.
Sie können aus dem Obigen wissenDer Wert von $instance
ist appindexcontrollerIndex code> Instanz. <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">$instance
的值就是appindexcontrollerIndex
的实例。
这块也是存在中间件的概念,依然如此中间件会在后文中单独提到,这里不做解释。
在这里$this->app['middleware']->controller
这段代码的使用,还能记得是使用的ArrayAccess还是直接为__get吗?
这里是在使用访问数组的形式访问对象,所以使用的是ArrayAccess的形式,这俩种概念一定要区分清楚。
接下来就会执行获取方法名,至于这个方法名怎么获取的是在本类的init方法执行的,这里只需要知道返回的是index
$this->app['middleware; ]->controller
Können Sie sich bei der Verwendung dieses Codes noch erinnern, ob es sich um ArrayAccess oder direkt um __get handelt? 🎜🎜Hier 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. Wie der Methodenname abgerufen wird, befindet sich in dieser Klasse Die init-Methode wird ausgeführt. Sie müssen nur wissen, dass Folgendes zurückgegeben wird: index
Das ist es. 🎜Was Sie hier beachten müssen, ist diese Codezeile$this->rule->getConfig('action_suffix')
,这里获取的是Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?。
假如现在给这个Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?设置一个值会变成什么样子呢!
给添加一个kaka的值,进行访问一下看会是什么结果。
这个时候进行访问会提示indexkaka的这个方法不存在,是不是清晰可见了,说明这个参数是在为所有的方法名追加一个kaka。
对获取当前操作名的代码进行扩展完成之后,紧接着就是if (is_callable([$instance, $action])) {
,在这里可以看见我们的老朋友is_callable
。
对于这里的is_callable俩个参数通过上文都知道是什么了,第一个参数为appindexcontrollerIndex
的实例,第二个参数为index
if (is_callable([$instance, $action])) {
, hier können Sie siehe unseren alten Freundis_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ühren Sie die Operationsmethode aus. 🎜Dann <code style="font" in der klasse appindexcontrollerindex> -size: 14px; Zeilenumbruch: 2px 4px; Hintergrundfarbe: rgba(27,31,35,.05); Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">index
Ob der Methodenname ausgeführt werden kann. is_callable
的作用就是检测在appindexcontrollerIndex
类中的index
方法名是否可以执行。
很明显这里会返回一个true,因为在index类里边存在index方法的。
这里在做测试之前一定要把刚刚在app的配置文件中配置的方法名后缀那个给取消掉。
通过这个is_callable
判断会存在三种情况,接下来咔咔将会从三个方面给大家进行解析。
第一种情况:类里边存在可执行的方法
$vars
<img src="https://img-blog.csdnimg.cn/20201111001613166.png" alt="Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?" style="max-width:90%"><span style="font-weight: 700; color: rgb(248, 57, 41);">Die erste Situation: Es gibt eine ausführbare Methode in der Klasse</span><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;"><ul data-tool=" mdnice editor" style="margin-top: 8px; padding-left: 25px; padding-left: 25px;"><li><section style="margin-top: 5px ; margin-bottom: 5px; line-height: 26px; color: rgb(53, 53, 53);">Zuerst eine ReflectionMethod-Klasse zurückgeben</section></li></ul></figcaption><li><section style="margin-top: 5px; : 5px; line-height: 26px; color: rgb(53, 53, 53);">Get method name index<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>
<li><section style="margin-top: 5px; margin-bottom: 5px; height: 26px; color: rgb(53, 53, 53);">Wenn das Methodennamensuffix nicht festgelegt ist, wird leer zurückgegeben🎜🎜<li><section style="margin-top: 5px; : 5px; line-height: 26px; color: rgb(53, 53, 53);">Legen Sie den aktuellen Operationsnamen fest🎜🎜<li><section style="margin-top: 5px; margin-bottom: 5px; -height: 26px; color : rgb(53, 53, 53);">In diesem Fall sind keine Parameter festgelegt, daher ist der endgültige <code style="font-size: 14px; 2px 4px; Randradius: 0 2px; Hintergrundfarbe: rgba(27,31,35,.05); -all; color: rgb (271, 93, 108);">$vars
ist 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🎜🎜🎜Ich habe vorher kein Routing verwendet, sondern direkt die Standardadresse verwendet. Diese Routing-Adresse wird als nächstes verwendetVerwenden Sie diese Routing-Adresse, um die Daten auszudrucken. Sie können sehen, dass es sich um die Routing-Parameter handelt, die wir festgelegt haben.
Diese Methode zum Abrufen von Anforderungsvariablen gibt Folgendes ein: $this->request->param();
Diese Codezeile$this->request->param();
这行代码
框架是如何获取参数的
访问地址:http://www.source.com/index.php/hello/hello
在上文知道是通过$this->request->param()
来获取参数的,那么在框架是如何获取参数的呢!
根据流程代码会执行到下图,根据获取的请求方式来使用对应的方式来获取参数,在这里需要明确的是我们使用的是get请求。
所以代码会执行到$this->param
$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: route
方法,看到注释就明白是用来Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?的,但是还是需要在进入一层到input。
在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。
所以说$this->route
就是存放的这条路由规则所有的参数,包含路由参数。
这时执行流程会执行到获取变量 支持过滤和默认值,在上文中$this->route
$this->route
ist der Ort, an dem alle Parameter dieser Routing-Regel gespeichert werden, einschließlich der Routing-Parameter. 🎜🎜🎜Ergebnisse drucken🎜🎜🎜Zu diesem Zeitpunkt wird der Ausführungsprozess ausgeführt, um Variablen zu erhalten, die Filterung und Standardwerte unterstützen. Im obigen $this->route
Der übergebene Parameter ist falsch, also wird dieser Block direkt zurückgegeben werden. 🎜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. $vars
就是获取到的路由参数。
第二种情况:类里边不存在可执行的方法
当第一种判断执行is_callable
判断类里边的方法不可执行时,就会执行到第二种情况。
先来请求的一个没有设置的路由地址,看会返回什么。
根据代码给的提示,我们来到index控制器建立一个_empty
is_callable
Wenn festgestellt wird, dass die Methode in der Klasse nicht ausführbar ist, wird die zweite Situation ausgeführt. 🎜🎜🎜Der zweite Ausführungsfall🎜🎜🎜Fordern Sie zunächst eine nicht festgelegte Routing-Adresse an und sehen Sie, was zurückgegeben wird. 🎜🎜🎜Error return🎜🎜🎜Gemäß den Anweisungen des Codes gehen wir zum Index-Controller, um ein _empty
Methode, und fordern Sie sie dann erneut an, um zu sehen, was passiert. 🎜Sie können den Druckergebnissen entnehmen, dass diese Methode ausgeführt wird, wenn die Methode, auf die zugegriffen wird, nicht vorhanden ist_empty
.
Wie wird diese Methode ausgeführt? Diese Ausführungsmethode wird durch die Verwendung des Reflexionsmechanismus erreicht. Es gibt einen speziellen Artikel zur Erläuterung der Reflexion von Kaka, aber Sie müssen das Dokument 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.
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.
Im vorherigen Abschnitt haben wir das Routing für drei oder vier Perioden erklärt, und die letzte Erklärung ist dann die Routing-Planung wie man das eingestellte Routing ausführt!
Verwenden Sie diese Route als Nächstes als Fall
Erinnern Sie sich an den Rückgabewert, als Sie mit der Routenerkennung begonnen haben? Bitte schauen Sie sich das Bild unten an
Zu diesem Zeitpunkt gab es keine detaillierte Erklärung des folgenden Codes. Er erklärte direkt die Instanziierung des Controllers ist jetzt Aktuelle Planungsinformationen aufzeichnen
diese Zeile Code. 记录当前调度信息
这行代码。
在这里$this->request
Der Code wird also an der unten gezeigten Position ausgeführt, um die Planungsinformationen der aktuellen Anfrage festzulegen oder abzurufen🎜<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img-blog.csdnimg.cn/20201111114359747.png" alt="Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?" style="max-width:90%"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">Stellen Sie die Planungsinformationen der aktuellen Anforderung ein oder rufen Sie sie ab. Wenn Sie hier bei der Controller-Instanziierung drucken, werden Sie feststellen, dass der hier zurückgegebene Wert </figcaption> ist. Kommen Sie als Nächstes zur Controller-Prüfung es raus. </figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">index
Daten druckenDaten drucken Diese Methode 根据代码追踪可以看到其实就是 来到 在 Schauen Sie zurück und werfen Sie einen Blick auf diese Zeit 所以说最终的值就是刚刚打印的只是单独的数组形式的。 那么接下来的动作就跟不使用路由访问的流程一样的,就不用在进行解析了。 直到这里关于路由地址是怎么进行控制器实例化的就结束了。 关于给 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. 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. Als nächstes 在这个执行流程的第一行中thinkroutedispatchModule
这个类Module
这个类,又会发现继承着Dispatch
类thinkphp/library/think/route/Dispatch.php
这个类的控制器中,会发现对dispatch
Diese Klasse 🎜🎜<img src="https://img-blog.csdnimg.cn/20201111141709893.png" alt="Alias der Klasse" style="max-width:90%"> Alias der Klasse 🎜🎜🎜 ; Randradius: 0 2px; Hintergrundfarbe: rgba(27,31,35,.05); ; color: rgb (271, 93, 108);">Modul
Sie werden feststellen, dass es Dispatch
class🎜🎜 🎜Vererbung der Klasse🎜🎜🎜 in thinkphp/library/think/route/Dispatch.php
Im Controller davon Klasse finden Sie den dispatch
Diese Variable eingestellt ist. 🎜Route to module/controller/operation
Welche Parameter werden hier an die Methode übergeben, hahaWie instanziiert die ThinkPHP-Routing-Adresse den Controller?
这里的方法传入的参数是什么,哈哈$this->app->controller
传入的是index
,返回的是整个类名,具体的实现过程就不去解析了,实现的方法是$this->parseModuleAndClass
Routing an Module / Die Parameter des Controllers/BetriebsDer Endwert wird also einfach in Form eines separaten Arrays gedruckt. Instanziieren Sie den Controller
Dann ist die nächste Aktion die gleiche 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 $this->parseModuleAndClass
, Sie können Ihre eigene Recherche durchführen! 🎜🎜🎜🎜🎜 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. 🎜$this ->autoResponse($data);
Diese Methode führt eine detaillierte Analyse durch. Diese Methode bedeutet wörtlich automatische Antwort. $this->autoResponse($data);
这个方法进行深入的解析,这个方法按照字面意思就是Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?。$data instanceof Response
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. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><span style="font-weight: 700; color: rgb(248, 57, 41);">Über die Verwendung von „Instanceof“</span></p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Instanceof kann bestimmen, ob ein Objekt eine Instanz einer bestimmten Klasse ist und ob ein Objekt eine bestimmte Schnittstelle implementiert. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"> Als nächstes wird Kaka Ihnen ein einfaches Beispiel geben, um dies zu demonstrieren, und Sie werden verstehen, was vor sich geht. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><span style="font-weight: 700; color: rgb(248, 57, 41);">Fall 1</span></p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Erstellen Sie zunächst zwei Klassen. Der Fall ist wie unten dargestellt. </p>
<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img-blog.csdnimg.cn/20201112115737556.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmdrYW5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?" style="max-width:90%"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">Demo-Fall</figcaption></figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Das Bild unten ist das Druckergebnis. Sie können sehen, dass das erste true und das zweite false zurückgibt. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"> bestimmt, ob ein Objekt eine Instanz einer bestimmten Klasse ist, also eine Instanz von <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">$instance
就是类Test
, und gibt daher true zurück.
Fall zwei
Fall zwei unterscheidet sich von Fall eins. Eine Schnittstelle wird eingerichtet, und dann implementiert die Klasse die Schnittstelle.
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.
Das obige gilt für Instanz von
Das Verständnis der beiden angegebenen Demonstrationsfälle besteht darin, festzustellen, ob eine Instanz eine Instanz einer bestimmten Klasse ist. instanceof
给出的俩种Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?,对其理解就是判断一个实例是否为某个类的实例。
那么就在回到正文,$data instanceof Response
这行代码肯定不会成立,因为data传过来的就是控制器返回的值。
所以说代码执行流程会执行到下图位置,使用了is_null
Die ersten beiden Punkte in diesem Code werden nicht analysiert. Die erste besteht darin, den Antwortausgabetyp standardmäßig automatisch zu identifizieren. Dies dient dazu, festzustellen, ob es sich um eine Ajax-Anfrage handelt. Die spezifische Implementierungsmethode wartet dieses Mal, bis Kaka den Framework-Quellcode analysiert hat, und dauert dann einige Zeit Jeden Tag einige Methoden des Frameworks durchführen. 🎜🎜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. 🎜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);
来到类thinkphp/library/think/Response.php
的方法create
中,这个方法就是用来Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?。
这里只需要去关注一下咔咔圈出来的地方即可,在thinkphp/library/think/response
Come to classthinkphp/library/think/Response.php
create
, diese Methode wird zum Erstellen eines Antwortobjekts verwendet. Sie müssen nur auf die durch den Klick umkreiste Stelle achten, in thinkphp/library/think/response
In diesem Verzeichnis befindet sich kein HTML. 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 - In Fügen Sie hier die Bildbeschreibung ein
Dann weist der Code den Rückgabewert zu autoResponse
$response diese Variable. <li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: rgb(53, 53, 53);">Zum Schluss fügen Sie diesen <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31) hinzu ,35,.05); Schriftfamilie: Operator Mono, Consolas, Monaco, Monospace; Senden Sie das Ergebnis zurück und drucken Sie es wie unten gezeigt aus. </section></li></ul><figure data-tool=" mdnice>Hier Bildbeschreibung einfügen<img src="https://img-blog.csdnimg.cn/20201112162041397.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmdrYW5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="Wie instanziiert die ThinkPHP-Routing-Adresse den Controller?" style="max-width:90%"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;"></figcaption><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Drucken Sie die Rückgabeinformationen aus<code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">autoResponse
这个方法的$response
这个变量。
最后就是将这个$response
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!