En tant que programmeur, il est important que vous compreniez le flux du système avec lequel vous travaillez, non seulement pour pouvoir modifier quelque chose au besoin, mais aussi parce que cela vous donnera un regain de confiance en vous-même..
Aujourd'hui, nous allons choisir OpenCart et le disséquer pour comprendre les bases du processus de dispatching. Nous commencerons par décrire le processus de répartition et, au fur et à mesure, nous explorerons les tranches de code des différentes sections du cadre..
Je vais prendre la dernière version d'OpenCart pour cet article, mais le flux est plus ou moins similaire dans les versions précédentes..
Dans toute application Web, le processus de répartition permet de rechercher le mappage entre l'URL de la demande entrante et le module correspondant dans la structure. Bien sûr, la mise en œuvre varie d'un cadre à l'autre, mais le concept sous-jacent reste le même. Voici donc certaines des responsabilités du répartiteur:
Essayons de comprendre cela en utilisant un exemple simple dans OpenCart. Pour créer un nouvel utilisateur à partir du serveur frontal, il est nécessaire de s’inscrire sur le site à l’adresse http://www.votreopendartstore.com/index.php?route=account/register. Résumons les étapes suivies par OpenCart pour rendre la page demandée.
Voilà donc une vue d'ensemble de la manière dont OpenCart parcourt l'URL demandée et renvoie la réponse. Dans la section suivante, nous allons aller plus loin et voir comment cela se passe exactement..
Allez-y et ouvrez le index.php
fichier dans la racine du document d'OpenCart. Il se passe beaucoup de choses dans ce fichier, mais ne vous laissez pas submerger, car il s’agit en grande partie de la configuration des objets utilisés dans le cadre..
Tirons tout de suite l'extrait de notre intérêt de ce fichier.
// Front Controller $ controller = new Front ($ registry); // Mode de maintenance $ controller-> addPreAction (new Action ('common / maintenance')); // URL du SEO $ controller-> addPreAction (new Action ('common / seo_url'));
Comme avec la plupart des frameworks, OpenCart s'appuie également sur le modèle du contrôleur frontal afin qu'il y ait un point d'entrée commun pour toutes les requêtes de l'application..
Premièrement, nous créons une instance du contrôleur frontal et l’attribuons au $ contrôleur
variable. Immédiatement à côté de cela, nous appelons le addPreAction
méthode pour ajouter quelques actions.
Cela nous amène à un autre sujet: qu'est-ce qu'une "pré-action"? En termes simples, une préAction est une action qui sera exécutée avant l'action demandée sur n'importe quelle page. Par exemple, lorsque l'utilisateur clique sur une page, vous souhaitez vérifier si le site est en mode maintenance ou non avant que la réponse réelle ne soit renvoyée. Dans ce cas, vous pouvez utiliser une préAction pour que l’utilisateur soit redirigé vers la page de maintenance s’il est activé..
Aussi, nous ajoutons common / seo_url
comme pré-action également, car dans le cas d'un site compatible SEO, nous voulons récupérer les variables de routage correspondantes avant le début de la distribution.
Passons au prochain extrait important.
// Routeur if (isset ($ request-> get ['route']))) $ action = nouvelle action ($ request-> get ['route']); else $ action = new Action ('common / home');
Il vérifie la présence de la variable de chaîne de requête «route» et, le cas échéant, nous créerons une instance du action
class en passant la valeur actuelle de "route" en tant qu’argument constructeur. S'il n'est pas présent, nous ferons la même chose avec l'URI de route de la page d'accueil.-commun / maison
.
Avec notre $ action
ensemble de variables avec la valeur appropriée, passons à l'extrait suivant.
// Dispatch $ controller-> dispatch ($ action, nouvelle action ('error / not_found'));
Enfin, nous appelons le envoi
méthode de la classe du contrôleur frontal. Allez-y et ouvrez système / moteur / front.php
et trouvez l'extrait suivant.
fonction publique dispatch ($ action, $ error) $ this-> error = $ error; foreach ($ this-> pre_action en tant que $ pre_action) $ result = $ this-> execute ($ pre_action); if ($ result) $ action = $ result; Pause; while ($ action) $ action = $ this-> execute ($ action);
C'est la méthode où toute la magie se produit! Premièrement, il exécute toutes les «pré-actions» décrites précédemment. En outre, dans la boucle while, il va essayer d'exécuter notre courant $ action
, passé comme un argument de la exécuter
méthode.
Suivons la définition du exécuter
méthode dans le même fichier.
fonction privée execute ($ action) $ result = $ action-> execute ($ this-> registry); if (is_object ($ result)) $ action = $ result; elseif ($ result === false) $ action = $ this-> error; $ this-> error = "; else $ action = false; return $ action;
A la toute première ligne, le exécuter
méthode du action
la classe est appelée. Ne confondez pas cela avec le exécuter
méthode de la classe de contrôleur frontal. Ouvrir le fichier système / moteur / action.php
et le voici.
fonction publique execute ($ registry) // Arrête l'appel de méthodes magiques si (substr ($ this-> méthode, 0, 2) == '__') return false; if (is_file ($ this-> fichier)) include_once ($ this-> fichier); $ class = $ this-> class; $ controller = new $ class ($ registry); if (is_callable (array ($ controller, $ this-> méthode))) return call_user_func (array ($ controller, $ this-> méthode), $ this-> args); else return false; else return false;
La chose importante à noter ici est que le action
classe définit déjà les variables requises dans le constructeur même lorsque l'objet d'action est instancié dans index.php
. Il met en place le fichier
, classe
et méthode
propriétés, qui seront utilisées dans le exécuter
méthode. Pour que les choses restent moins compliquées, nous ne discuterons que de la exécuter
méthode, bien que je vous recommande de passer par le constructeur de la action
classe.
Retour à notre exécuter
méthode du action
classe, il vérifie la présence du fichier ($ this-> file
) associé à l’itinéraire actuel. Si tout va bien, il inclut ce fichier et appelle la méthode correspondante ($ this-> méthode
) de cette classe de contrôleur en utilisant le call_user_func
fonction et retourne la réponse.
Si le fichier associé n'est pas disponible, il retournera faux
. Maintenant, revenons à l'extrait de la exécuter
méthode de la classe de contrôleur frontal. Soyez patient, nous y sommes presque!
… $ Resultat = $ action-> exécuter ($ this-> registry); if (is_object ($ result)) $ action = $ result; elseif ($ result === false) $ action = $ this-> error; $ this-> error = "; else $ action = false; return $ action;…
Une fois la méthode execute du action
classe termine le processus, il retourne le résultat et il est assigné à la $ résultat
variable. Maintenant, il y a trois possibilités différentes avec la valeur stockée dans $ résultat
. Examinons chacun.
Si tout va bien, nous aurons une sortie HTML dans le $ résultat
variable, donc le $ action
variable est définie sur faux
et le processus se termine. C'est le dernier cas.
Rappelons que nous sommes revenus faux
si le fichier de contrôleur correspondant n’a pas été trouvé dans exécuter
méthode du action
classe. Dans ce cas, le $ action
variable sera mis à $ this-> error
(Erreur non trouvée action
), et “page non trouvée” sera montré à l'utilisateur.
Et enfin, si nous trouvons que le $ résultat
est un objet lui-même, nous allons le mettre à la $ action
variable. Oui, c'est étrange: pourquoi diable la méthode du contrôleur renverrait-elle une autre action
objet, quand il est censé renvoyer la sortie HTML pour la page demandée? Mais ce n’est là qu’un des moyens utilisés par le contrôleur pour rediriger les utilisateurs vers une autre URL..
Ouvrons rapidement le catalogue / contrôleur / commun / maintenance.php
déposer et le voir en action. dans le indice
méthode, il retourne le action
objet si certaines conditions sont vraies.
… If (($ route! = 'Payment' && $ route! = 'Api') &&! $ This-> user-> isLogged ()) renvoie une nouvelle action ('common / maintenance / info'); …
Donc, comme vous pouvez le voir, il renvoie le action
objet pour rediriger l'utilisateur vers le commun / maintenance / info
URL Bien sûr, il y a un code dans le envoi
méthode de la classe du contrôleur frontal pour gérer ce problème. Rappelez l'extrait de cette méthode, je vous promets que c'est le dernier extrait de ce tutoriel..
… While ($ action) $ action = $ this-> exécuter ($ action); …
Donc, c'est une boucle while, et il court jusqu'à ce qu'il trouve le $ action
variable définie à faux
! Plus spécifiquement, cela mettra fin à la boucle lorsque nous aurons une sortie utile pour notre utilisateur.
C'est donc la fin du voyage. J'espère que ce n'était pas aussi compliqué qu'il y paraissait au premier abord.
Aujourd'hui, nous avons abordé un aspect important du cadre OpenCart, le processus de répartition. Nous avons compris les bases du dispatching et parcouru tout le processus pour comprendre son fonctionnement..
Si vous recherchez des outils, utilitaires, extensions, etc. OpenCart supplémentaires que vous pouvez exploiter dans vos propres projets ou pour votre propre éducation, n'oubliez pas de voir ce que nous avons sur le marché..
Pour toute question, n'hésitez pas à laisser vos commentaires. En outre, Twitter est une autre option pour me contacter, et je réponds rapidement.