{"id":229429,"date":"2022-11-04T11:42:00","date_gmt":"2022-11-04T08:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229429"},"modified":"2022-11-09T07:03:10","modified_gmt":"2022-11-09T04:03:10","slug":"prototypage-rapide-prototyper-pour-coder-partie-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-prototyper-pour-coder-partie-2\/","title":{"rendered":"Prototypage rapide : Prototyper pour coder, partie 2"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-prototyper-pour-coder-partie-1\/\" title=\"Le post pr\u00e9c\u00e9dent\" >Le post pr\u00e9c\u00e9dent<\/a> d\u00e9montre beaucoup de travail en prenant quelque chose qui \u00e9tait autrefois un prototype rapide et en prenant ce prototype pour coder. Si vous n&rsquo;avez pas suivi, nous avons fait ce qui suit\u00a0:<\/p>\n<ol>\n<li>parl\u00e9 et construit un prototype pour un plugin,<\/li>\n<li>sch\u00e9matis\u00e9 une approche orient\u00e9e objet peut fonctionner,<\/li>\n<li>et refactoris\u00e9 notre prototype en code r\u00e9el.<\/li>\n<\/ol>\n<p>\u00c0 ce stade, il y a quelques autres choses que nous pouvons faire pour am\u00e9liorer notre code. A savoir, nous pouvons introduire le concept d&rsquo;espaces de noms. Cela am\u00e8ne l&rsquo;organisation un peu plus loin et peut rapporter des dividendes pour des projets plus importants.<\/p>\n<p>Voici donc un aper\u00e7u de la fa\u00e7on dont cela se d\u00e9roule dans notre projet actuel.<\/p>\n<h2>Prototype \u00e0 coder\u00a0: espaces de noms<\/h2>\n<p>J&rsquo;ai couvert les espaces de noms en profondeur dans les articles pr\u00e9c\u00e9dents. Si vous ne l&rsquo;avez pas lu, <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/espaces-de-noms-et-chargement-automatique-dans-wordpress\/\" title=\"je vous le recommande\" >je vous le recommande<\/a>. Revenez ensuite et consultez le reste du message.<\/p>\n<p>Si vous choisissez de sauter l&rsquo;article, voici <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">une br\u00e8ve d\u00e9finition d&rsquo;un espace de noms<\/a>\u00a0:<\/p>\n<blockquote>\n<p>Les espaces de noms sont con\u00e7us pour r\u00e9soudre deux probl\u00e8mes rencontr\u00e9s par les auteurs de biblioth\u00e8ques et d&rsquo;applications lors de la cr\u00e9ation d&rsquo;\u00e9l\u00e9ments de code r\u00e9utilisables tels que des classes ou des fonctions\u2026<\/p>\n<\/blockquote>\n<p>Et l&rsquo;id\u00e9e g\u00e9n\u00e9rale est que nous organisons nos cours en fonction d&rsquo;une relation logique qu&rsquo;ils entretiennent entre eux.<\/p>\n<p>De plus, nous organisons \u00e9galement les fichiers dans des r\u00e9pertoires qui correspondent \u00e0 l&rsquo;espace de noms. Ce n&rsquo;est pas quelque chose qui doit \u00eatre fait, mais je trouve que cela aide d&rsquo;avoir les classes organis\u00e9es logiquement sur le disque de la m\u00eame mani\u00e8re qu&rsquo;elles sont virtuellement organis\u00e9es dans l&rsquo;espace de noms.<\/p>\n<p>Cela dit, organisons les fichiers.<\/p>\n<h3>Organiser les fichiers<\/h3>\n<p>Plut\u00f4t que de commencer par le fichier principal du plugin, commen\u00e7ons par organiser nos fichiers en premier.<\/p>\n<ul>\n<li>Les fichiers Meta Box et Meta Box Display r\u00e9sideront dans un r\u00e9pertoire appel\u00e9 <strong>Display<\/strong>. C&rsquo;est compl\u00e8tement arbitraire, mais puisque c&rsquo;est ce que font ces fichiers, il semble logique que ce soit l\u00e0 qu&rsquo;ils r\u00e9sident.<\/li>\n<li>Nous pouvons \u00e9galement placer les fichiers <strong>message-description.php<\/strong> et <strong>no-post-list.php<\/strong> dans ce r\u00e9pertoire, mais pla\u00e7ons-les dans un sous-r\u00e9pertoire appel\u00e9 <strong>Views<\/strong>. Vous voudrez peut-\u00eatre appeler cela <strong>Templates<\/strong> ou <strong>Partials<\/strong> ou quelque chose de similaire.<\/li>\n<li>Ensuite, nous avons les classes charg\u00e9es d&rsquo;interroger la base de donn\u00e9es et la classe charg\u00e9e de coordonner la messagerie. Pla\u00e7ons chacun d&rsquo;entre eux dans <strong>Utility.<\/strong> Il y a d&rsquo;autres endroits o\u00f9 ils pourraient aller, bien s\u00fbr, mais rappelez-vous que le but est de montrer comment utiliser les espaces de noms. Donc, si vous vous sentez si enclin, n&rsquo;h\u00e9sitez pas \u00e0 ajuster vos fichiers en fonction de vos go\u00fbts.<\/li>\n<\/ul>\n<p>Si vous avez suivi ce que nous avons ci-dessus, vous devriez avoir une structure de r\u00e9pertoires qui ressemble \u00e0 ceci\u00a0:<\/p>\n<p>Une fa\u00e7on d&rsquo;organiser vos fichiers.<\/p>\n<p>Il est maintenant temps de d\u00e9finir des espaces de noms pour chacune des classes. Puisque nous les avons tous organis\u00e9s dans leurs r\u00e9pertoires, il sera facile de sp\u00e9cifier un espace de noms\u00a0; cependant, il est important de reconna\u00eetre que nous aurons besoin d&rsquo;utiliser le\u00a0 mot-cl\u00e9 <strong><a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">use<\/a><\/strong> lorsque nous utiliserons des classes situ\u00e9es dans d&rsquo;autres espaces de noms.<\/p>\n<p>Passons en revue chacun de nos fichiers en commen\u00e7ant par les fichiers dans <strong>Utility<\/strong>. Tout d&rsquo;abord, nous allons commencer par le <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-00-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Messenger<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Display content for the meta box when requested.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\nnamespace McFarlinTRPUtility;\nuse McFarlinTRPUtilityPost_Query;\n\n\/**\n * Retrieves information from the class responsible for querying the database and\n * renders it in the context of our meta box when called via the Meta Box Display.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Messenger {\n  \/\/ Snip for brevity. \n}<\/code><\/pre>\n<p>Vous remarquerez que l&rsquo;espace de noms du fichier appara\u00eet dans l&rsquo;en-t\u00eate avec une d\u00e9claration pour utiliser la\u00a0 classe <strong>Post Query<\/strong> que nous avons cr\u00e9\u00e9e. J&rsquo;ai ajout\u00e9 le nom de la classe \u00e0 la fin de l&rsquo;espace de noms, donc je n&rsquo;ai pas \u00e0 l&rsquo;utiliser dans toute la base de code.<\/p>\n<p>Remarquez que le constructeur ressemble maintenant <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-01-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Instantiates the class by setting a reference to the query.\n *\n * @param string $plugin_dir The path to the root of the plugin directory.\n *\/\npublic function __construct( $plugin_dir) {\n\n    $this-&gt;query      = new Post_Query();\n    $this-&gt;plugin_dir = trailingslashit( $plugin_dir );\n}<\/code><\/pre>\n<p>J&rsquo;ai ajout\u00e9 un\u00a0 argument <strong>$plugin_dir<\/strong> car nous devons l&rsquo;utiliser pour afficher correctement les r\u00e9sultats de la requ\u00eate. Et puisqu&rsquo;elles r\u00e9sident maintenant dans une zone diff\u00e9rente de l&rsquo;application, les fonctions ressemblent <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-02-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Displays the description of the content of the meta box.\n *\n * @access private\n *\/\nprivate function get_post_message() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/post-list.php';\n}\n\n\/**\n * Displays the description of the content of the meta box.\n *\n * @access private\n *\/\nprivate function get_description() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/message-description.php';\n}\n\n\/**\n * Displays a message of there are no recent posts.\n *\n * @access private\n *\/\nprivate function get_no_posts_message() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/no-post-list.php';\n}<\/code><\/pre>\n<p>Ensuite, regardons la\u00a0 classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-03-post-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Query<\/a>. Rien n&rsquo;a beaucoup chang\u00e9 dans cette classe, sauf que nous lui avons donn\u00e9 un espace de noms, et nous avons \u00e9galement mis \u00e0 jour la requ\u00eate uniquement pour retirer trois messages (selon <a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/#comment-911828\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">this comment<\/a> ).<\/p>\n<pre><code>&lt;?php\n\nnamespace McFarlinTRPUtility;\n\n\/**\n * Queries the database for three most recent posts. Returns the query to the\n * caller so that it can be interrogates for posts or not.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Query {\n\n  \/\/ Snip for brevity.\n\n    private function get_posts() {\n\n        $args = array(\n            'post_type'        =&gt; 'post',\n            'post_status'      =&gt; 'publish',\n            'posts_per_page' =&gt; 3,\n            'orderby'          =&gt; 'date',\n            'order'            =&gt; 'desc',\n        );\n        $this-&gt;query = new WP_Query( $args );\n\n        return $this-&gt;query;\n    }\n}<\/code><\/pre>\n<p>Remarquez que dans le code, j&rsquo;ai \u00e9galement <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pr\u00e9fix\u00e9 WP_Query<\/a> avec une barre oblique car il fait partie de l&rsquo;espace de noms global.<\/p>\n<p>Passons au\u00a0 r\u00e9pertoire <strong>Display<\/strong> et examinons <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-04-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la classe Meta Box<\/a>. Cela a \u00e9galement re\u00e7u un espace de noms et utilise \u00e9galement le nom complet de la\u00a0 classe <strong>Meta Box Display<\/strong> que nous examinerons dans un instant.<\/p>\n<pre><code>&lt;?php\n\n namespace McFarlinTRPDisplay;\n use McFarlinTRPDisplayMeta_Box_Display;\n\n\/**\n * Registers the Meta Box with WordPress. Defines the ID, title, display function,\n * and the post type on which it will live.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Meta_Box_Display\n     *\/\n    private $meta_box_display;\n\n    \/**\n     * Instantiates the class by setting its property equal to a reference to its display.\n     *\n     * @param string $plugin_dir A reference to the root of the plugin's directory.\n     *\/\n    public function __construct( $plugin_dir) {\n        $this-&gt;meta_box_display = new Meta_Box_Display( $plugin_dir );\n    }\n\n    \/\/ Snip for brevity.\n}<\/code><\/pre>\n<p>Notez que ce constructeur accepte \u00e9galement le r\u00e9pertoire du plugin comme argument et le transmet \u00e9galement \u00e0 la\u00a0 classe <strong>Meta Box Display<\/strong>. C&rsquo;est pour que les fonctions charg\u00e9es d&rsquo;afficher les messages puissent \u00eatre correctement trouv\u00e9es \u00e0 leur emplacement dans le\u00a0 r\u00e9pertoire des <strong>vues<\/strong>.<\/p>\n<p>Enfin, passons en revue la\u00a0 classe <strong>Meta Box Display<\/strong>. Il s&rsquo;agit d&rsquo;une classe simple qui inclut l&rsquo;espace de noms et fait r\u00e9f\u00e9rence au <strong>Post Messenger<\/strong> que nous avons examin\u00e9 ci-dessus.<\/p>\n<pre><code>&lt;?php\n\/**\n * Defines the display for the meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\nnamespace McFarlinTRPDisplay;\nuse McFarlinTRPUtilityPost_Messenger;\n\n\/**\n * Defines the display for the meta box that will render the content in the\n * context of its meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box_Display {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Post_Messenger\n     *\/\n    private $messenger;\n\n    \/**\n     * Instantiates the object by setting a property equal to that of the class\n     * responsible for rendering the messages from the post query.\n     *\n     * @param string $plugin_dir A reference to the root of the plugin's directory.\n     *\/\n    public function __construct( $plugin_dir) {\n        $this-&gt;messenger = new Post_Messenger( $plugin_dir );\n    }\n\n    \/**\n     * If there are posts to display, renders them in the metabox. Otherwise, displays\n     * a note that there are no posts to display.\n     *\/\n    public function display() {\n        $this-&gt;messenger-&gt;get_message();\n    }\n}\n<\/code><\/pre>\n<p>\u00c0 ce stade, nous avons boucl\u00e9 la boucle \u00e0 travers le plugin. \u00c0 une exception pr\u00e8s: le fichier bootstrap. Nous lui avons ajout\u00e9 un espace de noms et devons mettre \u00e0 jour la mani\u00e8re <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-06-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dont il est instanci\u00e9<\/a>\u00a0:<\/p>\n<pre><code>&lt;?php\n\nnamespace McFarlinTRP;\nuse McFarlinTRPDisplayMeta_Box;\n\ninclude 'Display\/class-meta-box.php';\ninclude 'Display\/class-meta-box-display.php';\ninclude 'Utility\/class-post-messenger.php';\ninclude 'Utility\/class-post-query.php';\n\nadd_action( 'add_meta_boxes', __NAMESPACE__. 'trp_start' );\n\/**\n * Starts the plugin.\n *\/\nfunction trp_start() {\n\n    $meta_box = new Meta_Box( dirname( __FILE__) );\n    $meta_box-&gt;init();\n}<\/code><\/pre>\n<p>A savoir, nous avons\u00a0:<\/p>\n<ul>\n<li>d\u00e9fini l&rsquo;espace de noms,<\/li>\n<li>r\u00e9f\u00e9rencer l&#8217;emplacement de la\u00a0 classe <strong>Meta Box<\/strong> ,<\/li>\n<li>mis \u00e0 jour les chemins pour inclure o\u00f9 trouver les fichiers (ce qui peut finalement \u00eatre fait avec un chargeur automatique),<\/li>\n<li>et mis \u00e0 jour l&rsquo;\u00a0 appel <strong>add_action<\/strong>.<\/li>\n<\/ul>\n<p>Voici la chose \u00e0 propos de l&rsquo;appel d&rsquo;action d&rsquo;ajout\u00a0: \u00e9tant donn\u00e9 que WordPress doit localiser cette fonction et que la fonction r\u00e9side dans un espace de noms, le nom complet de la fonction doit \u00eatre identifi\u00e9 afin que WordPress puisse l&rsquo;invoquer. D&rsquo;o\u00f9 la n\u00e9cessit\u00e9 de <strong><a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.nsconstants.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">NAMESPACE<\/a><\/strong> dans le nom de la fonction.<\/p>\n<h2>Maintenant, nous sommes organis\u00e9s (\u00e0 une exception pr\u00e8s)<\/h2>\n<p>Comme vous pouvez le constater, les espaces de noms et les r\u00e9pertoires qui leur correspondent ajoutent beaucoup d&rsquo;organisation \u00e0 un projet. C&rsquo;est plus facile \u00e0 suivre, plus facile de comprendre o\u00f9 vont les choses (pour les fichiers existants et nouveaux). Et cela donne moins l&rsquo;impression d&rsquo;accumuler de nombreux fichiers en un seul endroit.<\/p>\n<p>M\u00eame si une classe est un peu monolithe, elle peut toujours \u00eatre organis\u00e9e de mani\u00e8re \u00e0 faciliter la maintenance.<\/p>\n<p>Cela dit, il y a encore quelque chose que je changerais \u00e0 propos de ce plugin\u00a0: faire circuler le r\u00e9pertoire du plugin comme celui-ci n&rsquo;aide pas \u00e0 une faible coh\u00e9sion et il couple plus \u00e9troitement les classes ensemble car le fichier d&rsquo;amor\u00e7age doit transmettre une valeur dans une classe qui le transmet \u00e0 une autre classe qui l&rsquo;utilise pour charger des fichiers et ainsi de suite.<\/p>\n<p>Alors, y a-t-il des moyens de r\u00e9soudre ce probl\u00e8me\u00a0? Absolument. Et nous y reviendrons peut-\u00eatre dans le post final.<\/p>\n<p>D&rsquo;ici l\u00e0, rappelez-vous que la version la plus r\u00e9cente du plugin est disponible <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sur la branche master, \u00e9tiquet\u00e9e 0.3.0, sur GitHub<\/a>.<\/p>\n<h2>Messages de la s\u00e9rie<\/h2>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-avec-wordpress-du-concept-au-plugin\/\" title=\"Prototypage rapide avec WordPress\u00a0: du concept au plugin\">Prototypage rapide avec WordPress\u00a0: du concept au plugin<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-avec-wordpress-analyse-de-concept\/\" title=\"Prototypage rapide avec WordPress: analyse de concept\">Prototypage rapide avec WordPress: analyse de concept<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-prototyper-pour-coder-partie-1\/\" title=\"Prototypage rapide: Prototyper pour coder, partie 1\">Prototypage rapide: Prototyper pour coder, partie 1<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Prototypage rapide: Prototyper pour coder, partie 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-presentation-du-chargement-automatique\/\" title=\"Prototypage rapide\u00a0: pr\u00e9sentation du chargement automatique\">Prototypage rapide\u00a0: pr\u00e9sentation du chargement automatique<\/a><\/li>\n<\/ol>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans l&rsquo;effort continu de passer du prototype au code, je vais prendre le plugin en cours et impl\u00e9menter des interfaces pour l&rsquo;organisation.<\/p>\n","protected":false},"author":1,"featured_media":223922,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,717,841],"tags":[1167],"class_list":["post-229429","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-developpeur","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=229429"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229429\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223922"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}