Comment fonctionne la distribution dans OpenCart

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..

Envoi en quelques mots

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:

  • Prenez les paramètres appropriés à partir de l'objet de requête.
  • Trouver le module et l'action correspondants à appeler.
  • Si le module et l'action correspondants sont trouvés, le processus d'envoi se termine.
  • Si aucun module n'est trouvé pour la demande donnée, l'action par défaut est définie et le processus de répartition se termine..

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.

  • Premièrement, il vérifie la présence de la variable de chaîne de requête «route», sinon il définira le «commun / home» comme «route» par défaut de la page..
  • Dans notre cas, il est présent, il va donc configurer les variables requises et déclencher le processus de dispatch.
  • Au début du processus de répartition, certaines des actions «préAction» utilisées pour exécuter des tâches courantes seront exécutées. Nous discuterons des choses "préAction" dans la dernière partie de cet article.
  • Enfin, il vérifiera s'il existe un fichier de contrôleur disponible pour la variable "route" actuelle et s'il en existe un, il sera appelé pour récupérer la réponse..
  • S'il n'y a pas de fichier de contrôleur disponible pour la variable «route» demandée, il exécutera l'action «erreur / non trouvé», qui affiche le message «page non trouvée» à l'utilisateur..

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..

Traverser le courant

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.

Conclusion

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.