Maison  >  Article  >  cadre php  >  ThinkPHP détecte une analyse approfondie du routage d'URL

ThinkPHP détecte une analyse approfondie du routage d'URL

咔咔
咔咔original
2020-12-01 12:09:462082parcourir

Avant-propos

En raison de la longueur de l'article, je l'écrirai dans un nouvel article.

Dans l'article précédent, je vous ai expliqué le contenu suivant.

  • Une analyse simple de la compréhension initiale du routage
  • Parlons de l'apparence en définissant l'itinéraire
  • Définition de l'itinéraire Que fait exactement $this->group dans la méthode de règle ?
  • Prétraitement des règles de routage
  • Accès rapide pour analyser et générer des identifiants de routage

Mais il reste encore beaucoup de choses à expliquer sur le routage. Ensuite, nous analyserons le contenu suivant.

  • Configuration de la tournée (dans le retour dans le fichier de tournée)
  • Première introduction au dispatch
  • route-check détecte les routes URL
  • . . . . . . . . . . . . .

Ce qui suit sera expliqué en détail un par un.

Je vous donne également un schéma d'exécution sur le routage pour votre référence.

ThinkPHP détecte une analyse approfondie du routage dURL
Processus d'exécution du routage

1. >

Le contenu de cette partie se trouve dans l'application d'exécution. Ensuite, Kaka vous donnera une brève introduction.

Il n'y a aucune explication du code source dans cette section, il sert juste à ouvrir la voie aux chapitres suivants, il est donc nécessaire de savoir ce qu'est le dispatch.

La figure suivante montre le processus de retour à la couche supérieure pour continuer l'exécution après l'initialisation du routage.

Ensuite, la détection de routage sera exécutée.

ThinkPHP détecte une analyse approfondie du routage dURL
emplacement d'exécution initial de répartition

Le test de routage est utilisé comme indiqué ci-dessous

ThinkPHP détecte une analyse approfondie du routage dURL
Cas d'utilisation du test de routage

Ensuite, nous pouvons imprimer ces informations de planification

ThinkPHP détecte une analyse approfondie du routage dURL
Imprimer les données
ThinkPHP détecte une analyse approfondie du routage dURL
Imprimer le résultat

Dans l'image ci-dessus, les valeurs pertinentes​​sur l'expédition ont été imprimées

Ensuite, un simple aperçu de la routeCheck méthode sera effectué

ThinkPHP détecte une analyse approfondie du routage dURL
routeCheck

Dans la méthode ci-dessus, indiquez simplement clairement que le cache sera traité dans cette étape et qu'un objet Dispatch sera renvoyé.

Vous pouvez simplement jeter un oeil au code source de cette pièce, ce n'est pas très important.

route-check détecte le routage d'URL

Mais vous devez quand même jeter un bref coup d'œil à ce contenu.

Avant de le regarder, vous devez clarifier quels sont les deux paramètres transmis.

Paramètre 1 : règles de routage Paramètre 2 : Vérifier si le routage obligatoire est configuré

ThinkPHP détecte une analyse approfondie du routage dURL
Renvoyer un objet d'envoi

Après avoir connu la signification des paramètres, vous devez passer à la méthode de vérification 1 Découvrez.

ThinkPHP détecte une analyse approfondie du routage dURL
Détecter le routage d'url

Dans cette méthode, concernant la détection automatique du routage des noms de domaine, imprimons à quoi ressemblent les données.

En fait, le résultat renvoyé est le même que la méthode précédente de montage du routage des ressources

ThinkPHP détecte une analyse approfondie du routage dURL
Imprimez le résultat

Ensuite. passera le séparateur pathinfo : remplacez le / dans l'URL par |

et obtenez la route du fichier de configuration pour voir si elle correspond complètement à

Enfin, utilisez la route par défaut pour analyser

Voici les détails que je n'entrerai pas dans une analyse approfondie. Il y a trop de détails sur le routage. Si vous vous concentrez sur les détails un par un, cela prendra beaucoup de temps.

Donc c'est tout pour cette pièce. Il vous suffit de savoir ce qui est exécuté et ce qui est rendu au final.

2. Comment trouver la classe de requête

Dans la section précédente, $result = $domain->check($this->request, $url, $completeMatch); exécutera ce bloc contenu.

Nous ne nous soucions pas de ce que cette méthode effectue ici.

Vous devez plutôt vous soucier de savoir si cela $this->request est trouvé et exécuté.

La première chose que vous pouvez voir est que l'attribut request existe dans la classe Route.

ThinkPHP détecte une analyse approfondie du routage dURL
Demandez les propriétés de l'objet

Venez ensuite chez le constructeur de Route, où vous trouverez un nouveau monde.

ArrayAccess est utilisé ici pour accéder à l'objet comme un tableau, mais l'attribut request n'existe pas dans $app, donc la méthode magique __get dans la classe conteneur sera exécutée. Ce qui est appelé dans la méthode __get est. le conteneur La méthode make, le premier paramètre est request, et l'instance de request sera finalement renvoyée.

ThinkPHP détecte une analyse approfondie du routage dURL
Constructeur

Le $app ici est en fait l'instance d'application qui arrive via l'injection de dépendances.

Après avoir lu autant de code source, je dois savoir que la classe App hérite de la classe Container, qui est la classe conteneur.

Il existe plusieurs méthodes magiques en bas de la classe conteneur.

Il vous suffit de faire attention à la méthode __get ici.

ThinkPHP détecte une analyse approfondie du routage dURL
Méthode magique

La méthode __get est une fonction qui sera exécutée lors de l'accès à une propriété inexistante.

C'est-à-dire que la méthode make finira par être exécutée.

ThinkPHP détecte une analyse approfondie du routage dURL
La méthode make dans la classe conteneur

Cette méthode passera par une série d'opérations et retournera finalement une instance de Request.

Et stockez cette instance dans le conteneur, et vous pourrez l'obtenir directement la prochaine fois que vous l'utiliserez.

À propos de la méthode make dans la classe conteneur, c'est une méthode particulièrement importante dans la classe conteneur, et c'est aussi la méthode soul.

Les instances de l'ensemble du framework sont renvoyées via le conteneur, il n'est donc pas nécessaire d'en dire plus sur l'importance de cette méthode.

Kaka a déjà eu une compréhension très approfondie des conteneurs et l'a présentée à tout le monde sous la forme d'un article.

3. Détecter le routage du nom de domaine

Je vais d'abord dessiner le processus pour vous, puis suivre cette étape. selon le processus, cliquez simplement sur le rythme.

ThinkPHP détecte une analyse approfondie du routage dURL
Organigramme de détection du nom de domaine de routage

La première chose à confirmer est que la détection du routage du nom de domaine est effectuée dans l'application d'exécution.

Le processus d'exécution de niveau supérieur est l'endroit où se trouve le fichier d'entrée.

ThinkPHP détecte une analyse approfondie du routage dURL
Exécutez l'application

D'abord le code sera exécuté dans la méthode routeCheck, puis regardez d'abord ce fichier.

Regardez d'abord les commentaires. L'explication de cette méthode est la détection de routage d'URL.

Dans cette méthode, le cache de route sera d'abord détecté. Ce contenu concerne le cache.

La chose la plus importante dans cette méthode est 路由检测 返回一个Dispatch对象cette méthode.

ThinkPHP détecte une analyse approfondie du routage dURL
Détection de routage d'URL

Regardons ensuite cette méthode.

La première chose à clarifier est quels sont les deux paramètres transmis.

  • $path : string(4) "blog"
  • $must : bool(false)
ThinkPHP détecte une analyse approfondie du routage dURL
Détection d'itinéraire

Les opérations suivantes seront effectuées lors de la détection du routage d'URL.

  • séparateur pathinfo : remplacez le / dans l'URL par |
  • Si l'itinéraire correspond exactement à
  • Détecter le routage des noms de domaine
  • Analyse de l'itinéraire par défaut

L'étape suivante consiste à effectuer une analyse approfondie du processus de routage des noms de domaine .

Les deux premières exécutions ne sont qu'un traitement de chaîne, il suffit de jeter un œil et de savoir ce qui sera renvoyé à la fin.

ThinkPHP détecte une analyse approfondie du routage dURL
Détecter le routage d'URL

Clarifiez également la signification des trois paramètres dans l'exécution de la détection du routage des noms de domaine.

  • $this->request : Grâce à la méthode magique __get de la classe conteneur, la méthode make de la classe conteneur est exécutée, et enfin l'objet instance de la requête est renvoyé. Cette colonne n'est pas visible第六节的文章
  • $url : string(4) "blog"
  • $completeMatch : Si l'itinéraire correspond complètement

Venez à $result = $domain->check($this->request, $url, $completeMatch); ici, qui est l'objet de cette section.

Dans cette méthode, les processus suivants seront exécutés et les processus d'exécution importants seront analysés en profondeur.

  • Détecter l'alias d'itinéraire : checkRouteAlias
  • Détecter la liaison d'URL : checkUrlBind
  • Juger les paramètres de routage
  • Ajouter un middleware de nom de domaine
  • Détecter le routage des paquets : parent::check
ThinkPHP détecte une analyse approfondie du routage dURL
Détecter la route du nom de domaine

Détecter l'alias de la route : checkRouteAlias

Explication des paramètres

  • $request : exemple de classe de requête
  • $url : blog réussi

Il y a deux points de connaissances qui doivent être clarifiés dans cette méthode

  • strpos : Rechercher la position de la première occurrence dans la chaîne
  • strstr : strstr renvoie un pointeur pointant vers la position où string2 apparaît pour la première fois dans string1, strstr( "Helloworld! ","world");?>nSortie : nworld !
  • L'adresse URL sera d'abord traitée : retourner au blog
  • Obtenir la définition de la route d'alias NULL
  • Prenons l'exemple du blog de routage des ressources et renvoyez false
ThinkPHP détecte une analyse approfondie du routage dURL
Détecter l'alias de route

Il existe une méthode de détection des alias de routage que vous devez examiner

Le paramètre est le blog transmis dans l'image ci-dessus

ThinkPHP détecte une analyse approfondie du routage dURL
Obtenir la définition de la route de l'alias

En ce qui concerne cette méthode, la première chose à préciser est que cette méthode est en classe thinkphp/library/think/Route.php

et cette classe En utilisant toutes les classes sous thinkroute

, cette méthode obtiendra le blog routé à partir de la détection et l'obtiendra à partir de l'attribut alias dans la classe Route. S'il n'existe pas, NULL sera renvoyé

.

L'utilisation de cet alias sera mentionnée ci-dessous

ThinkPHP détecte une analyse approfondie du routage dURL
Obtenir la définition de la route alias

Arrivez à la fin de la détection de la route aliasreturn $item ? $item->check($request, $url) : false; qui est cette ligne de code, Comme vous pouvez le voir sur l'image ci-dessus, cet élément est NULL

et ce NULL sera finalement renvoyé.

Détecter la liaison d'URL : checkUrlBind

Description du paramètre

  • $request : Instance de classe de requête
  • $url : Le blog passé

Dans cette méthode, seuls les lieux encerclés dans l'image ci-dessous sont expliqués en détail.

ThinkPHP détecte une analyse approfondie du routage dURL
Détecter la liaison d'URL

Accédez à la méthode getBind pour lire la liaison d'itinéraire. Vous pouvez voir que Kaka a imprimé les paramètres entrants.

Cette méthode fait partie de la classe thinkphp/library/think/route/Domain.php. N'oubliez pas que cette classe est utilisée lors de la définition des règles de routage dans le groupe $This->. Si vous ne le savez pas, vous pouvez lire la première section de l'article de routage.

En même temps, cette méthode subDomain obtiendra le nom de sous-domaine actuel.

Cette méthode finira par renvoyer www, en regardant principalement la première partie encerclée.

Obtenez le nom de domaine actuel via la méthode hôte dans la classe de requête, puis divisez-le.

Données de retour : array(1) { [0] =>n string(3) "www"n>

Attribuer une valeur au nom du sous-domaine : $this->subDomain

Renvoyer le résultat final et renvoyer le nom du sous-domaine : www

ThinkPHP détecte une analyse approfondie du routage dURL
Obtenir le nom du sous-domaine actuel

Ensuite, il reviendra en haut couche, où la valeur actuelle obtenue sera jugée sous-domaine WWW.

Certains sont tous des traitements de jugement. Le premier jugement ne sera certainement pas établi, car seul www est renvoyé, non.

Le jugement ci-dessous est basé sur la liaison de routage, ici il vous suffit de le faire. sachez que NULL sera toujours renvoyé. Le jugement effectué par

ThinkPHP détecte une analyse approfondie du routage dURL

sait que NULL est renvoyé dans la couche inférieure, donc le jugement ici ne sera pas non plus établi, donc le résultat final est renvoyé à la couche supérieure C'est faux.

ThinkPHP détecte une analyse approfondie du routage dURL
Détecter la liaison d'URL

Déterminer les paramètres de routage

Selon la figure ci-dessus, le processus d'exécution reviendra éventuellement à thinkphp/library/think/route/Domain.phpcette méthodecheck pour détecter le routage du nom de domaine.

Commencez ensuite à déterminer les paramètres de routage.

S'il n'y a pas de paramètre de routage, il sera ignoré et non exécuté.

Il existe des paramètres de routage : Exécuter la méthode setRouteVars : Définir les variables de routage. Ce paramètre ne peut être utilisé que dans la version 5.1.5 ou supérieure du framework. La version utilisée par Kaka étant un peu basse, je ne l'expliquerai pas. en détails.

ThinkPHP détecte une analyse approfondie du routage dURL
Détecter le routage des noms de domaine
ThinkPHP détecte une analyse approfondie du routage dURL
Documentation

Ajouter un middleware de nom de domaine

Concernant le middleware, je ne l'expliquerai pas ici, car un nouvel article sera ouvert ultérieurement pour l'expliquer en détail. Cet article se concentre toujours sur le routage !

Détecter le routage des paquets

Ensuite, vous arriverez au dernier processus de détection du routage du nom de domaine, et le code d'exécution return parent::check($request, $url, $completeMatch);

sautera à la classe 文件:thinkphp/library/think/route/RuleGroup.php, car la classe Domain hérite de la classe RuleGroup.

Description du paramètre

  • $request : instance de la classe de requête
  • $url : blog passé
  • $completeMatch : si le l'itinéraire correspond complètement

Dans cette méthode, Kaka n'expliquera en détail qu'un des processus ici, qui consiste à fusionner les paramètres de regroupement.

Parce que cette méthode est également la ligne principale tout au long du processus d'exécution, et les autres sont des méthodes de détection et de jugement.

ThinkPHP détecte une analyse approfondie du routage dURL
Fusionner les paramètres de regroupement

Résumé

J'ai consacré deux articles sur le routage et ce n'est pas encore fini. Après avoir lu si longtemps le code source, le routage est le plus compliqué et le plus difficile à comprendre.

Les classes sont connectées les unes après les autres. Le routage sera temporairement appris ici, et d'autres contenus seront ajoutés plus tard lors de la lecture d'autres codes sources.

Vous devez lire attentivement l'organigramme principalement exécuté dans l'article de routage.

ThinkPHP détecte une analyse approfondie du routage dURL
Organigramme d'exécution

Ce qui est finalement renvoyé est la classe Domain via l'attribut group lors de l'enregistrement des règles de routage. Le contenu ici doit être clair.

Connaître principalement le processus de configuration du nom de domaine dans le routage et quand le nom de domaine est configuré.

Vous devez avoir une idée claire du tableau de retour dans le fichier de routage et du processus d'importation du fichier de routage.

Revoyons ensuite ArrayAccess que nous avons appris auparavant et accédons à des objets tels que des tableaux.

La méthode magique __get dans le conteneur. Dans cette méthode magique, il y a la méthode make, qui sert principalement à renvoyer une instance d'une classe et à la stocker dans le conteneur.

Il s'agit pour le moment de l'aspect routage. Il est prévu que le routage soit terminé en un seul article.

«

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 que Kaka a toujours défendues depuis sa carrière. J'espère que les articles de Kaka dans Nuoda Internet pourront vous apporter un peu. 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