Maison >cadre php >PensezPHP >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-04 12:57:26174parcourir

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 ?
Demande d'adresse

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 ?
Exécuter la méthode du contrôleur par réflexion

Ensuite, le nom de la méthode sera obtenu Quant à savoir comment obtenir le nom de la méthode, il se trouve dans l'initialisation de. cette classe La méthode est exécutée. Il vous suffit de savoir que la valeur renvoyée 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 ?
Suffixe de méthode d'opération

À quoi cela ressemblerait-il si nous définissons maintenant une valeur pour ce suffixe de méthode d'opération !

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 ?
Kaka ajouté pour les tests

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

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Résultats d'accès

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])) {, où vous pouvez voir notre vieil ami 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 n'est pas défini et renvoie vide
  • Définir le nom de l'opération actuelle
  • n'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 ?
Partie test du code

Le routage n'a pas été utilisé auparavant, mais l'adresse par défaut a été utilisée directement. Cette adresse de routage sera utilisée ensuite

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Utilisez la nouvelle adresse de routage pour les tests

Utilisez cette adresse de routage pour imprimer les données, et vous pouvez voir que ce sont les paramètres de routage que nous avons définis.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Impression des données

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

Le framework est Comment obtenir le paramètre

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

Comme je le sais ci-dessus, il s'obtient via $this->request->param() Paramètres, alors comment obtenir les paramètres dans le framework ?

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 ?
Récupérer les paramètres de la requête en cours

Quand vous arriverez à cette route méthode, vous comprendrez en voyant les commentaires qu'elle sert à obtenir le paramètres de routage, mais vous devez toujours entrer une couche à saisir.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Obtenir les paramètres de routage

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

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Définir les variables de routage

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 ?
Imprimer les résultats

À 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 dans le paramètre $this->route ci-dessus. transmis est faux , donc cette pièce sera renvoyée directement.

获取变量 支持过滤和默认值
L'obtention de variables prend en charge le filtrage et les valeurs par défaut

Les résultats renvoyés ici seront renvoyés à l'endroit où nous avons commencé l'analyse ci-dessus, ce qui signifie que ce $vars est obtenu paramètres de routage.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Résultat du paramètre de routage retourné

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

Lorsque le l'exécution du premier jugement is_callable détermine que la méthode de la classe n'est pas exécutable, la deuxième situation sera exécutée.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Le deuxième cas d'exécution

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 ?
Retour d'erreur

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

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Définissez la méthode _empty dans 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 ?
Imprimer les résultats

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 ?
La troisième situation

Après avoir exécuté les trois situations

Après avoir analysé les trois situations, tout va se passer en fin de compte Pour exécuter des méthodes statistiques.

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 ?
Exécution statistique

2. Comment instancier le contrôleur avec l'adresse de routage

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 ?
Case route

Vous souvenez-vous de la valeur de retour lorsque vous avez démarré la détection d'itinéraire ? ? Veuillez voir l'image ci-dessous

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Détection d'itinéraire
Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Résultat d'impression

Il n'y a pas eu de connexion à à ce moment-là, le code est expliqué en détail et explique directement le contrôleur instancié. 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 requête en cours

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Définir ou obtenir les informations de planification de la requête en cours

En imprimant ici dans l'instanciation du contrôleur, vous constaterez que la valeur renvoyée ici est index, ceci valeur Il est défini dans le contrôleur. Ensuite, accédez au contrôleur pour le vérifier.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Imprimer les données

Accédez à la méthode init pour imprimer le résultat et afficher le résultat, en utilisant l'adresse de routage

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Imprimer les données
Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Avec adresse de routage
没有Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Sans adresse de routage

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 ?
Imprimer les résultats

La dernière étape de la section de routage consiste à lancer la planification de la route, et enfin à appeler une route vers le module/contrôleur/méthode d'opération.

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

Cette méthode dispatchModule instancie enfin une classe. Ensuite, nous devons étudier cette classe en profondeur

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?<.>Routage vers module/contrôleur/opération
D'après la trace du code, vous pouvez voir qu'il s'agit en fait de la

classethinkroutedispatchModule

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?alias de la classe
Lorsque vous arrivez à la classe

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

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ? héritage de classe
dans

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

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

À ce moment, je reviendrai sur Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?Quels sont les paramètres transmis par la méthode ici, haha

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?的参数
Paramètres acheminés vers des modules/contrôleurs/actions

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 ?
Instancier le contrôleur

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

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

À propos du passage de $this->app->controller à 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, seules les méthodes du contrôleur d'exécution sont mentionnées. est revenu de l'endroit indiqué sur la photo ci-dessous, 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 ?
Demande automatique

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 qui doivent être renvoyées dans le contrôleur.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Les données renvoyées par le contrôleur
Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
La valeur des données imprimées

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 ?
Emplacement d'impression

Ensuite, procédons à 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 ?
Réponse automatique

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

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 tel qu'illustré ci-dessous.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Cas de démonstration

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 ?
Imprimer les résultats

Cas 2

Le cas 2 est différent du cas 1. Une interface est établie, puis la classe implémente le cas d'interface.

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?二
Cas de démonstration 2

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

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Imprimer les résultats

Ceci ci-dessus sont les deux cas de démonstration donnés pour instanceof Les comprendre, c'est juger si une instance appartient à une certaine classe. . Exemple.

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 dans l'image ci-dessous. La fonction is_null est utilisée pour faire 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. prenez le temps chaque jour d'analyser le framework. Une petite analyse de quelques méthodes.

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 ?
La position où le premier processus d'exécution du code est exécuté

Ensuite, nous devons analyser le troisième endroit non mentionné ci-dessus, qui est le code$response = Response::create($data, $type);

Venez à la méthode thinkphp/library/think/Response.php de la classe create Cette méthode est utilisée pour créer un 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 ?
Créer un objet Response

Lorsque vous arrivez au 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
  • Retour code d'état
  • Définir l'objet d'instance d'application
  • Informations d'en-tête
Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
in Insérez la description de l'image ici

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

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

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Insérer la description de l'image ici
Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Imprimez les informations de retour

Ensuite, le code sera toujours monter Le calque revient, revenant à 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 ?
Retour au niveau intermédiaire

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

Comment ladresse de routage ThinkPHP instancie-t-elle le contrôleur ?
Insérer la description de l'image ici

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

vous avez lu c'est vrai, le code ici semble familier !

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 ?
Réponse automatique

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 ses débuts. J'espère que les articles de Kaka sur l'immense Internet pourront vous apporter. un peu d'aide. Je m'appelle Kaka, à la prochaine fois

»
.

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