Maison  >  Article  >  cadre php  >  Comment l'adresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Comment l'adresse de routage ThinkPHP instancie-t-elle le contrôleur ?

咔咔
咔咔original
2020-12-29 11:14:331985parcourir

1. Exécutez la méthode dans le contrôleur

L'adresse de requête de cet article est le nom de domaine configuré.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

D'après ce qui précède, nous pouvons savoir que la valeur de $instance est une instance de appindexcontrollerIndex.

Cela a également le concept de middleware. Néanmoins, le middleware sera mentionné séparément dans l'article suivant et ne sera pas expliqué ici.

Ici$this->app['middleware']->controller Lorsque vous utilisez ce code, pouvez-vous encore vous rappeler s'il s'agit d'ArrayAccess ou de __get directement ?

Ici, nous accédons à l'objet sous forme d'accès tableau, nous utilisons donc la forme ArrayAccess. Les deux notions doivent être clairement distinguées.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Ensuite, le nom de la méthode sera obtenu. Quant à la façon d'obtenir le nom de la méthode, il est exécuté dans la méthode init de cette classe. nous seulement Vous avez juste besoin de savoir que ce qui est retourné est index.

Ce à quoi vous devez faire attention ici, c'est cette ligne de code $this->rule->getConfig('action_suffix') Ce qui est obtenu ici est le suffixe de la méthode d'opération.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

À quoi cela ressemblera-t-il si vous définissez une valeur pour ce suffixe de méthode d'opération maintenant !

Ajoutez une valeur kaka et accédez-y pour voir quel sera le résultat.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Lors de l'accès à ce moment, il sera demandé que la méthode indexkaka n'existe pas. Est-ce clairement visible Cela signifie que ce paramètre est ajouté à tous ? noms de méthodes.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Une fois l'expansion du code pour obtenir le nom de l'opération actuelle terminée, l'étape suivante est if (is_callable([$instance, $action])) {, ici On peut voir nos vieux amis is_callable.

Quant aux deux paramètres de is_callable ici, vous savez ce qu'ils sont d'après ce qui précède. Le premier paramètre est l'instance de appindexcontrollerIndex, et le deuxième paramètre est la méthode d'opération d'exécution de index.

Ensuite, le rôle de is_callable est de détecter si le nom de la méthode appindexcontrollerIndex dans la classe index peut être exécuté.

Évidemment, un vrai sera renvoyé ici, car il existe une méthode d'index dans la classe index.

Avant de faire le test ici, vous devez annuler le suffixe du nom de méthode que vous venez de configurer dans le fichier de configuration de l'application.

À travers ce is_callable jugement, il y aura trois situations. Ensuite, Kaka l'analysera sous trois aspects.

Première situation : Il y a une méthode exécutable dans la classe

  • Renvoyer d'abord une classe ReflectionMethod
  • Obtenir l'index du nom de la méthode
  • Le suffixe du nom de la méthode est non défini et renvoyé vide
  • Définissez le nom de l'opération actuelle
  • Il n'y a aucun paramètre défini dans ce cas, donc le $vars final est un tableau vide.

Afin de tester ce morceau de code avec des paramètres, nous devons apporter une petite modification à l'adresse de routage.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

La route n'a pas été utilisée auparavant, mais l'adresse par défaut a été utilisée directement. Cette route le sera. être utilisé ensuite Adresse

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Utilisez cette adresse de routage pour imprimer les données, vous pouvez voir que c'est nous Définir les paramètres de routage.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Cette méthode d'obtention des variables de requête entrera dans la $this->request->param(); ligne de code

Comment le framework obtient les paramètres

Adresse d'accès : http://www.source.com/index.php/hello/hello

Comme on le sait plus haut, les paramètres s'obtiennent via $this->request->param(), donc dans le cadre Comment pour avoir les paramètres !

Selon le code du processus, l'exécution sera comme indiqué ci-dessous. Utilisez la méthode correspondante pour obtenir les paramètres selon la méthode de requête obtenue. Ce qui doit être clair ici, c'est que nous utilisons la requête get. .

Le code sera donc exécuté vers $this->param. Les paramètres de la requête actuelle et les paramètres de l'adresse URL sont fusionnés ici.

Puisque Kaka effectue des requêtes en utilisant le routage, le framework encapsule ici spécifiquement un paramètre de requête pour le routage.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Quand vous arriverez à cette route méthode, vous comprendrez qu'il s'agit utilisé pour obtenir l'itinéraire lorsque vous voyez les commentaires, mais vous devez toujours entrer dans la couche d'entrée.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Dans l'article de routage précédent, les paramètres seront fusionnés lorsque les paramètres de routage seront obtenus. attribut route de la requête.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Donc $this->route stocke tous les paramètres de cette règle de routage, y compris les paramètres de routage.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

À ce stade, le processus d'exécution sera exécuté pour obtenir des variables prenant en charge le filtrage et les valeurs par défaut. $this->route est passé dans Le paramètre est faux, donc ce bloc sera renvoyé directement.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Les résultats renvoyés ici seront renvoyés à l'endroit où nous avons commencé l'analyse ci-dessus également. C'est-à-dire que ceci $vars est le paramètre de routage obtenu.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Deuxième cas : Il n'y a pas de méthode exécutable dans la classe

Lorsque le premier jugement est exécuté is_callable lorsque la méthode de la classe de jugement n'est pas exécutable, la deuxième situation sera exécutée.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Demandez d'abord une adresse de routage non définie et voyez ce qui sera renvoyé.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Selon les invites données par le code, nous allons au contrôleur d'index pour créer un _empty méthode, puis dans Venez la demander une fois et voyez ce qui se passe.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Il ressort des résultats de l'impression que lorsque la méthode accédée n'existe pas, la méthode _empty sera exécutée.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Alors, comment cette méthode est-elle exécutée ? Cette méthode d'exécution est obtenue en utilisant le mécanisme de réflexion. Il existe un article spécial pour expliquer la réflexion Kaka auparavant, mais vous devez toujours lire et visualiser le document.

La troisième situation : il n'y a pas de méthode exécutable ou de méthode _empty dans la classe

Cette situation est relativement simple, c'est-à-dire que le message d'erreur est renvoyé directement, le la gestion des exceptions ici sera également abordée plus tard.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Après l'exécution des trois situations

Une fois l'analyse des trois situations terminée, la méthode statistique sera exécuté à la fin.

La méthode d'appel de la classe d'exécution de réflexion prend en charge la liaison de paramètres, ce qui signifie que le processus d'exécution de fermeture ici est terminé ici.

Les requêtes automatiques suivantes sont expliquées en détail dans la section 5.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

2. Comment l'adresse de routage est instanciée dans le contrôleur

Dans la section précédente, nous avons expliqué le routage pour trois ou quatre périodes. L'explication finale concernait la planification du routage. Alors, comment le routage défini est-il exécuté ?

Utilisez ensuite cette route comme cas

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Mémorisez la valeur de retour lors du démarrage de la détection d'itinéraire Qu'est-ce que c'est ? Veuillez voir l'image ci-dessous

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

A cette époque, il n'y avait pas d'explication détaillée du code suivant, et le contrôleur instancié a été directement expliqué. Ce dont je veux parler maintenant, c'est de la 记录当前调度信息 ligne de code.

Ici $this->request est utilisé pour exécuter la méthode magique de la classe conteneur lors de l'accès à une propriété inexistante, et renvoie enfin une instance via le conteneur.

Ainsi, le code sera exécuté à la position indiquée ci-dessous, définissant ou obtenant les informations de planification de la demande en cours

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

En imprimant ici lors de l'instanciation du contrôleur, vous constaterez que la valeur renvoyée ici est index Cette valeur est définie dans le contrôleur. Ensuite, allez dans le contrôleur pour la vérifier. dehors.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Allez dans la méthode init pour imprimer le résultat pour voir le résultat, en utilisant l'adresse de routage

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Savez-vous pourquoi la valeur ici a changé ?

La valeur imprimée ci-dessus est l'image ci-dessous, pourquoi est-ce l'image ci-dessus ici !

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

La dernière étape de la section de routage consiste à lancer la planification de l'itinéraire, et enfin à appeler un itinéraire au module/ Contrôleur/action de cette méthode.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Cette méthodedispatchModuleEnfin, elle instancie également une classe. Ensuite, nous devons étudier cette classe. en profondeur

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

D'après la trace du code, vous pouvez voir qu'il s'agit en fait de thinkroutedispatchModulecette classe

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Lorsque vous arrivez à la classe Module, vous constaterez qu'elle hérite de la classe Dispatch

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Dans le contrôleur de classe thinkphp/library/think/route/Dispatch.php, vous constaterez que la variable dispatch est définie.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

En ce moment, revenez sur 路由到模块/控制器/操作Quels sont les paramètres passés dans la méthode ici, haha

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

La valeur finale est donc simplement imprimée sous la forme d'un tableau séparé.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Ensuite, l'action suivante est la même que le processus de non-utilisation de l'accès au routage, il n'est pas nécessaire à Analysé.

C'est la fin de la façon dont l'adresse de routage est instanciée.

Concernant l'entrée de $this->app->controller dans index, le nom complet de la classe est renvoyé. Le processus d'implémentation spécifique ne sera pas analysé. La méthode d'implémentation est $this->parseModuleAndClass.

3. Exécuter la planification de réponse automatique

Dans la section 4, il est uniquement mentionné que la méthode dans le contrôleur d'exécution est exécutée à partir de l'endroit ci-dessous Renvoyé, mais comment revenir n'est pas expliqué en détail.

Ensuite, je passerai un peu de temps à expliquer comment l'exécuter.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

L'adresse de routage d'accès est celle indiquée ci-dessous. Vous pouvez voir que les données renvoyées sont les données dont vous avez besoin. à retourner dans le contrôleur.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

La valeur imprimée est le suivant Emplacement de l'image, vous devez être clair ici ! La lecture du code source nécessite un peu d'exploration et, avec le temps, vous comprendrez le contenu.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Ce qui suit est une analyse approfondie de la méthode $this->autoResponse($data); Cette méthode signifie littéralement Réponse automatique. .

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Dans la première ligne de ce processus d'exécution $data instanceof Response, si vous ne comprenez pas cela, vous ne pourrez pas le lire.

Ce que vous ne savez pas et ne comprenez pas doit encore être résolu. Il suffit de lire le code source et de le conquérir petit à petit pour gagner.

À propos de l'utilisation d'instanceof

Instanceof peut déterminer si un objet est une instance d'une certaine classe et si un objet implémente une certaine interface.

Ensuite, Kaka vous donnera un exemple simple pour démontrer cela, et vous comprendrez ce qui se passe.

Cas 1

Créez d'abord deux classes. Le cas est celui indiqué ci-dessous.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

L'image ci-dessous est le résultat de l'impression. Vous pouvez voir que la première renvoie vrai et la seconde renvoie faux.

détermine si un objet est une instance d'une certaine classe. En d'autres termes, $instance est une instance de la classe Test, il retournera donc vrai.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Cas 2

Le cas 2 est différent du cas 1 Dans ce cas, une interface est établie, puis la classe implémente l'interface.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Les résultats finaux renvoyés sont tous vrais, ce qui signifie que si une classe implémente une autre interface, elle sera vraie lors du jugement.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Ce qui précède sont les deux cas de démonstration donnés pour instanceof Les comprendre, c'est juger un exemple. S'il s'agit d'une instance d'une certaine classe.

Puis revenons au texte, $data instanceof Response cette ligne de code ne sera définitivement pas établie, car la valeur transmise par les données est la valeur renvoyée par le contrôleur.

Ainsi, le processus d'exécution du code sera exécuté à la position indiquée ci-dessous. La fonction is_null est utilisée pour rendre le jugement. Le jugement doit être faux, donc le code suivant sera exécuté.

Les deux premiers points de ce code ne seront pas analysés.

La première consiste à identifier automatiquement le type de sortie de réponse par défaut. Il s'agit de déterminer s'il s'agit d'une requête ajax. La méthode d'implémentation spécifique attendra que KaKa analyse le code source du framework cette fois, puis prendra un certain temps. chaque jour pour apprendre quelques méthodes du framework. Faites une petite dissection.

La deuxième position consiste à obtenir les informations de configuration correspondantes à partir du fichier de configuration. Elle examine la méthode de la classe de règles qui est exécutée, mais dans la méthode se trouve le code qui est exécuté pour obtenir les informations de configuration.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Ensuite, vous devez vérifier la troisième partie non mentionnée ci-dessus Il est analysé, c'est-à-dire que le code $response = Response::create($data, $type);

arrive à la méthode thinkphp/library/think/Response.php de la classe create Cette méthode est utilisée pour créer l'objet Response.

Il suffit de faire attention à l'endroit encerclé ici. Il n'y a pas de html dans le répertoire thinkphp/library/think/response.

Le code instanciera donc directement cette classe puis reviendra.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Quand vous arrivez chez le constructeur de cette classe, vous faites principalement quelques choses.

  • Attribuer la valeur de retour à l'attribut data de cette classe
  • Définir le type de sortie de la page
  • Code d'état de retour
  • Définir l'objet d'instance d'application
  • Informations d'en-tête

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Ensuite, le code attribuera la valeur de retour à la variable autoResponse de cette méthode. $response

Enfin, ceci $response est renvoyé et les informations renvoyées impriment le résultat comme indiqué ci-dessous.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Ensuite, le code reviendra toujours à la couche supérieure et reviendra à la fonction de fermeture d'origine.

A l'endroit encerclé par le clic, la ligne de code suivante concerne également le middleware. Il faut juste savoir que le résultat final renvoyé est le même que le résultat imprimé sur l'image.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Le résultat final est renvoyé à thinkphp/library/think/route/Dispatch.php, où nous commençons l'analyse.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Renvoyer le résultat renvoyé à $data, puis l'exécuterreturn $this->autoResponse($data);

Vous avez bien lu, ici Familiarisez-vous avec le code !

Le résultat renvoyé à ce moment est une instance de Response, donc $response sera renvoyé directement.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?

Jusqu'à ce point, la méthode dans le contrôleur est exécutée et la réponse est analysée.

Qu'il s'agisse des règles de routage définies ou d'un accès direct à l'aide de la méthode du contrôleur de module, le résultat de la réponse sera finalement renvoyé via la méthode ci-dessus.

«

La persévérance dans l'apprentissage, la persévérance dans les blogs et la persévérance dans le partage sont les convictions auxquelles Kaka a toujours adhéré depuis sa carrière. J'espère que les articles de Kaka dans l'immense Internet. peut vous apporter un peu d'aide Silk. Je m'appelle Kaka, à la prochaine

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn