Utiliser les espaces de noms et le chargement automatique dans WordPress Plugins, Partie 4

S'il s'agit du premier tutoriel que vous lisez dans cette série, alors je vous recommande fortement de rattraper ce que nous avons couvert jusqu'à présent..

Essentiellement, vous arrivez à la fin du spectacle. À ce stade, nous avons jeté les bases de notre plugin, écrit le plugin et défini et exploré les espaces de noms et les autochargeurs. Il ne reste plus qu'à appliquer ce que nous avons appris.

Donc, dans ce tutoriel, nous allons rassembler toutes les pièces. Plus précisément, nous allons revoir le code source de notre plugin, l'espace de noms de toutes les classes pertinentes et écrire un autochargeur afin de pouvoir supprimer toutes nos instructions include..

Je vais discuter de tout en détail pendant que nous travaillons sur le code. Encore une fois, s'il s'agit du premier tutoriel que vous lisez dans cette série, rattrapez ce que nous avons couvert jusqu'à présent, puis revenez à ce tutoriel..

Avant d'écrire un code

À ce stade, vous devez savoir comment nous avons configuré notre environnement de développement. En guise de rappel, voici un bref aperçu du logiciel que nous utilisons:

  • au moins PHP 5.6.20
  • le serveur web Apache
  • un serveur de base de données MySQL
  • WordPress 4.6.1
  • une connaissance pratique de l'API du plugin WordPress

Vous aurez également besoin d'une copie du code source du plugin avec lequel nous travaillons. Vous pouvez en obtenir un exemplaire ici même. En supposant qu'il soit installé, activé et que votre IDE soit en cours d'exécution, commençons.

Namespacing le code

Rappelez-vous du tutoriel précédent, je suis un partisan de veiller à ce que nos espaces de noms suivent l’organisation des fichiers sur le disque. Si vous regardez la structure de répertoires de notre plugin ou si vous avez suivi la série jusqu'à présent, vous devriez voir quelque chose comme:

Notez que si vous avez configuré votre plugin différemment, c'est bien. Vos espaces de noms seront probablement différents, mais cela ne devrait pas affecter les éléments abordés dans cette série..

En utilisant la structure de répertoires comme guide, passons en revue tous les fichiers PHP qui composent notre plugin et définissons leurs espaces de noms. Faire ceci est facile: il suffit simplement d'utiliser le mot-clé namespace et de placer un nom qualifié en haut de chaque fichier..

Je vais énumérer chacun ci-dessous.

tutsplus-namespace-demo.php

classe-meta-box.php

classe-meta-box-display.php

interface-assets.php

class-css-loader.php

class-question-reader.php

Il y a quelques points à noter concernant les conventions que j'ai utilisées ci-dessus:

  • L'espace de noms racine est Tutsplus_Namespace_Demo, qui correspond au nom du répertoire du plugin.
  • Le reste des espaces de noms tels que Tutsplus_Namespace_Demo \ Admin et Tutsplus_Namespace_Demo \ Admin \ Util correspondent également à leurs répertoires respectifs; cependant, les noms de répertoire sont en majuscules (plutôt qu'en minuscules).

Enfin, si vous avez essayé d'actualiser la page ou de naviguer dans WordPress depuis l'introduction des instructions d'espace de nom, il est probable que vous constatiez une erreur dans votre console qui ressemble à ceci:

Et cela inclut le message suivant:

Avertissement PHP: call_user_func_array () s'attend à ce que le paramètre 1 soit un rappel valide, la fonction 'tutsplus_namespace_demo' est introuvable ou un nom de fonction non valide dans /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-includes/plugin.php à la ligne 524

Ou peut-être cela montre-t-il:

Erreur irrécupérable PHP: la classe 'Meta_Box' ne figure pas dans /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php à la ligne 48

Ou vous pouvez voir n'importe quel nombre d'autres messages d'erreur similaires. C'est bon. C'est normal.

Mais cela soulève la question: quoi de neuf avec notre plugin? Heureusement rien. C'est le comportement attendu.

Le premier message que vous voyez peut être le résultat d'un autre plugin que vous avez installé. Je suis incapable de le reproduire seul; Cependant, lorsque je désactive quelques-uns des autres plug-ins que j'ai en cours d'exécution, le plug-in génère le deuxième message (qui est le message que je voulais montrer)..

Lorsque vous codez un espace de noms, PHP s'attend à localiser une classe dans un espace de noms donné. Conceptuellement, vous pouvez penser que vos classes appartiennent maintenant à leur propre package (ou sous-package) ou à la définition que vous en donnez. Et pour qu'une fonction puisse accéder à une classe dans un paquet, il faut qu'elle soit informée des paquets existants..

C’est là que la fonctionnalité d’espace de noms et le chargement automatique entrent en jeu. Donc, avant d'essayer d'accéder à notre code via leurs espaces de noms, travaillons sur un autochargeur.

Tout sur le chargement automatique

L'écriture d'un autochargeur nécessitera les éléments suivants:

  1. comprendre une fonction PHP appelée spl_autoload_register
  2. écrire une fonction qui chargera automatiquement nos fichiers namespaced
  3. y compris notre fonction de chargement automatique personnalisée

Ne laissez pas le nom spl_autoload_register vous intimider. Cela signifie simplement que cette fonction fait partie de la "bibliothèque standard PHP" et que nous "enregistrons" une fonction "autoload". C'est une bouchée à dire et beaucoup de caractères à écrire, mais c'est juste une fonction que nous allons utiliser pour dire à PHP comment analyser les espaces de noms et les noms de classes et où il peut trouver nos fichiers.

Cette fonction est ce qui nous permet d’écrire notre propre code personnalisé pour le chargement automatique de fichiers, puis de lier ladite fonction à PHP. Nous allons donc dire à PHP où trouver nos fichiers et comment analyser les espaces de noms, les noms de fichiers, etc., de manière à inclure les fichiers..

Cela dit, nous sommes prêts à écrire un autochargeur..

Écrire un autochargeur

Lors de l'écriture d'un chargeur automatique, il convient de garder à l'esprit la manière dont nos fichiers sont organisés. Nous voulons savoir comment mapper nos espaces de noms sur nos annuaires.. 

Dans l'exemple que nous utilisons, c'est simple: les espaces de noms sont des versions casées de la structure de répertoires. Ce n'est pas toujours le cas pour d'autres projets. Cependant, c’est une autre raison pour laquelle j’aime organiser logiquement mes fichiers en fonction de leur emplacement physique..

Lorsque PHP essaie de charger une classe, notre autochargeur devra procéder comme suit:

  1. Diviser l'espace de noms en fonction des barres obliques.
  2. Séparez le package et les sous-packages en fonction des traits de soulignement et remplacez-les par des traits d'union (si nécessaire).
  3. Savoir mapper les noms de classe, les interfaces, etc. sur les noms de fichiers.
  4. Créer une représentation sous forme de chaîne du nom de fichier en fonction des informations ci-dessus.
  5. Inclure le fichier.

Avec tous ces arguments, nous avons du pain sur la planche. Dans le répertoire du plugin, créez un sous-répertoire appelé inc, et dans le inc répertoire créer un fichier appelé autoload.php.

Dans ce fichier, allons de l'avant et supprimons la fonction que nous allons utiliser pour charger automatiquement nos fichiers. Ça devrait ressembler a quelque chose comme ca:

De toute évidence, cela ne fait encore rien.

Une note sur l'écriture d'un autochargeur

Notez que je vais écrire le code et les commentaires de code pour expliquer en détail ce que nous faisons. Si vous vous lancez seul dans cette aventure pour la première fois, écrire un auto-chargeur, utiliser des espaces de noms et utiliser des fichiers peut être un peu frustrant. C’est là qu’un débogueur et l’utilisation de fichiers journaux peuvent être utiles. 

Ceci n’entre pas dans le cadre de ce didacticiel, mais sachez que l’écriture d’un chargeur automatique n’est pas quelque chose que vous pourriez faire correctement la première fois que vous le faites..

Terminer l'autoloader

Commençons par ajouter des fonctionnalités en fonction des étapes décrites au début de cette section..

Premièrement, nous devons créer une boucle qui va parcourir en arrière les parties du nom de fichier qui sont transmises à la fonction de chargement automatique. Nous faisons cela parce qu'il est plus facile de créer un chemin d'accès au fichier à charger automatiquement..

 0; $ i--) // Plus à venir… 

Après cela, nous devons regarder le $ file_parts et remplacez toutes les occurrences du trait de soulignement par un trait d'union, car tous nos noms de classes et interfaces utilisent des traits de soulignement, tandis que nos noms de fichiers utilisent des traits d'union..

Les deux lignes suivantes sont les deux premières lignes de la boucle que nous avons écrites ci-dessus:

Ensuite, nous allons avoir besoin d'un conditionnel qui fait quelques choses.

  1. Il doit vérifier quelle entrée du chemin du nom de fichier que nous lisons.
  2. Si nous en sommes à la première entrée, alors nous sommes au nom du fichier; sinon, nous sommes à son espace de noms.
  3. Ensuite, si nous lisons la première entrée, nous devons déterminer si nous essayons de charger automatiquement une interface ou si nous chargeons une classe..
  4. S'il s'agit de l'ancien, nous devons alors ajuster le nom de l'interface afin de la charger correctement en fonction de son nom de fichier; sinon, nous allons charger la classe en fonction de la valeur dans le $ actuel variable.

Cela se lit beaucoup, mais cela ne devrait pas être terriblement compliqué à lire. Voir le code commenté ci-dessous:

Cela fait, il est temps de créer un chemin d'accès complet au fichier. Heureusement, il ne s'agit guère que d'une simple concaténation de chaînes:

Enfin, nous devons nous assurer que le fichier existe. Sinon, nous afficherons un message d'erreur WordPress standard:

Et à ce stade, nous avons un autochargeur complet (qui peut être récupéré en téléchargeant les fichiers à partir du lien dans la barre latérale de ce message car le code source serait un peu long à publier ici dans le didacticiel)..

Enfin, il est important de noter que cette fonction particulière pourrait (ou devrait) être réécrite en tant que classe. De plus, la classe devrait comprendre plusieurs petites fonctions dont les fonctions peuvent être testées, ont une responsabilité unique et se lisent plus clairement que ce qui précède. Peut-être que dans un tutoriel de bonus, je vais passer en revue le processus de ce à quoi cela ressemblerait.

Mais nous incluons toujours des fichiers

Si vous regardez vers le haut du fichier de plugin principal (ou le fichier de démarrage que nous avons souvent appelé), vous remarquerez plusieurs comprendre déclarations qui ressemblent à ceci:

Compte tenu du travail que nous avons accompli jusqu'à présent, nous pouvons enfin supprimer ces déclarations et les remplacer par un seul:

Pour être clair, nous le remplaçons par notre chargeur automatique. À ce stade, nous devrions avoir terminé avec notre plugin.

Mettre tous ensemble

Maintenant que nous avons utilisé l'espacement des noms dans notre code pour fournir une organisation logique des classes liées et écrit un autochargeur pour inclure automatiquement les fichiers en fonction de l'espace de noms et de l'emplacement des fichiers de chaque classe, nous devrions pouvoir démarrer notre plugin et le faire fonctionner exactement comme il l'a fait. lors de la première itération réussie.

La dernière chose à faire est de mettre à jour le fichier d’amorçage afin que nous ordonnions à PHP d’utiliser les espaces de noms pour le fichier. Meta_Box, Meta_Box_Display, la Question_Reader, et le CSS_Loader.

init (); $ meta_box-> init (); 

Notez que dans le code ci-dessus, nous utilisons PHP utilisation mot-clé, et nous préfixons nos noms de classe avec leurs sous-paquets immédiats. Vous pouvez en savoir plus sur l'utilisation dans le manuel, mais en bref:

le utilisation mot-clé doit être déclaré dans la portée la plus externe d'un fichier (la portée globale) ou dans des déclarations d'espace de noms. C’est parce que l’importation est faite au moment de la compilation et non au moment de l’exécution, de sorte qu’elle ne peut pas être ciblée par un bloc.. 

Cela dit, et en supposant que tout fonctionne correctement, vous devriez pouvoir naviguer vers le Ajouter un nouveau message page (ou Modifier le message), consultez notre méta-boîte et consultez un message en haut de la barre latérale:

Si oui, alors félicitations. Vous avez correctement configuré votre plug-in sur vos espaces de noms et le chargement automatique. Sinon, revérifiez le code par rapport à ce que nous avons partagé ici, consultez vos journaux d'erreurs et assurez-vous que rien ne sort de l'ordinaire dans l'écran d'administration de WordPress..

Si vous faire voir quelque chose, les chances sont qu'il a à faire avec quelque chose de mineur. Passez en revue le code que nous avons couvert, comparez-le à ce qui est attaché ici à ce message (dans la barre latérale accompagnée du gros bouton bleu) et voyez si vous pouvez réduire le problème..

Conclusion

À ce stade, nous avons atteint la fin de notre série. Au cours des quatre derniers tutoriels, nous avons couvert beaucoup de terrain:

  • Nous avons créé un plugin qui pose des questions aux utilisateurs pour les aider à démarrer leur blog..
  • Nous avons utilisé des fonctions PHP pour lire des fichiers à partir du système de fichiers et les afficher à l'écran..
  • Nous avons défini les espaces de noms et le chargement automatique, et nous avons examiné comment ils peuvent être appliqués..
  • Nous avons organisé notre code et écrit notre propre chargeur automatique, le rendant plus lisible, organisé et moins encombré..

En fin de compte, une grande partie du matériel couvert dans cette série peut être utilisée dans des projets existants et futurs sur lesquels vous pouvez travailler.. 

N'oubliez pas que vous pouvez également trouver d'autres produits liés à WordPress sur notre marché. Et si vous souhaitez en savoir plus sur le développement de solutions pour WordPress, vous pouvez trouver tous mes tutoriels et séries sur ma page de profil. N'hésitez pas à me suivre sur mon blog ou sur Twitter car je discute presque quotidiennement du développement de logiciels dans le contexte de WordPress..

Et rappelez-vous, le lien pour télécharger le code source final se trouve dans la barre latérale sous un bouton intitulé Télécharger la pièce jointe. Bien sûr, n'hésitez pas à poser des questions dans les commentaires!

Ressources

  • spl_autoload_register
  • utilisation