{"id":231905,"date":"2023-01-04T13:11:00","date_gmt":"2023-01-04T10:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231905"},"modified":"2023-01-04T13:13:36","modified_gmt":"2023-01-04T10:13:36","slug":"decouplage-de-la-logique-de-domaine-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/decouplage-de-la-logique-de-domaine-dans-wordpress\/","title":{"rendered":"D\u00e9couplage de la logique de domaine dans WordPress"},"content":{"rendered":"\n<p>N&rsquo;oubliez pas que WordPress utilise le <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mod\u00e8le de conception pilot\u00e9 par les \u00e9v\u00e9nements<\/a> et bien que nous nous r\u00e9f\u00e9rions souvent aux actions et aux filtres, le concept se r\u00e9sume \u00e0 des crochets. Le flux de contr\u00f4le \u00e0 travers le programme ressemble \u00e0 ceci\u00a0:<\/p>\n<ol>\n<li>Ex\u00e9cuter le programme,<\/li>\n<li>Chaque fois que le programme tombe sur un crochet (dans WordPress, nous verrons <code>do_action<\/code>ou <code>apply_filters<\/code>), parcourez tous les crochets enregistr\u00e9s,<\/li>\n<li>Renvoyez le contr\u00f4le au programme,<\/li>\n<li>Ex\u00e9cuter jusqu&rsquo;au bout.<\/li>\n<\/ol>\n<p>Ce n&rsquo;est pas compl\u00e8tement diff\u00e9rent du mod\u00e8le Publisher\/Subscriber (ou <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PubSub<\/a>, pour faire court) mais il y a une diff\u00e9rence cl\u00e9\u00a0: le mod\u00e8le Event-Driven signale simplement que quelque chose s&rsquo;est produit et s&rsquo;il y a des crochets, ils se d\u00e9clencheront. Le mod\u00e8le PubSub dira \u00e0 un abonn\u00e9 enregistr\u00e9 de faire quelque chose.<\/p>\n<p>Quoi qu&rsquo;il en soit, revenons aux crochets dans WordPress. Conserver les deux concepts d&rsquo;hame\u00e7ons que nous avons peut \u00eatre plus facilement fait en les pensant comme ceci\u00a0:<\/p>\n<ul>\n<li>Les actions servent \u00e0 faire quelque chose,<\/li>\n<li>Les filtres sont destin\u00e9s au traitement des donn\u00e9es.<\/li>\n<\/ul>\n<p>Si vous cherchez \u00e0 aborder le d\u00e9veloppement WordPress de mani\u00e8re orient\u00e9e objet, coupler \u00e9troitement votre code au c\u0153ur de WordPress en enregistrant vos classes via des hooks \u00e0 l&rsquo;application principale n&rsquo;est pas une bonne id\u00e9e.<\/p>\n<p>En d&rsquo;autres termes, n&rsquo;enregistrez pas votre logique m\u00e9tier avec WordPress. Gardez-les s\u00e9par\u00e9s. Voici un test d\u00e9cisif pour savoir si votre travail est \u00e9troitement li\u00e9 \u00e0 WordPress\u00a0: si vous ne pouvez pas ex\u00e9cuter un test unitaire sur votre classe sans charger WordPress, il est \u00e9troitement li\u00e9.<\/p>\n<p>Alors, quelle est la solution\u00a0? D\u00e9l\u00e9gation.<\/p>\n<h2>Logique de domaine dans WordPress<\/h2>\n<p>La logique de domaine et la logique m\u00e9tier sont interchangeables en ce qui me concerne, donc si vous avez lu des articles pr\u00e9c\u00e9dents \u00e0 ce sujet et que j&rsquo;en ai parl\u00e9 de diff\u00e9rentes mani\u00e8res, vous savez pourquoi.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158738-61e6e493ec777.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158738-61e6e493ec777.png\" alt=\"D\u00e9couplage de la logique de domaine dans WordPress\"><\/a><\/p>\n<p><a href=\"https:\/\/unsplash.com\/photos\/guiQYiRxkZY\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Le cr\u00e9dit<\/a><\/p>\n<p>Ensuite, l&rsquo;id\u00e9e de d\u00e9l\u00e9guer la logique de WordPress \u00e0 une classe pour la logique de domaine dans WordPress est r\u00e9alis\u00e9e par une classe interm\u00e9diaire qui est responsable de ce qui suit\u00a0:<\/p>\n<ol>\n<li>S&rsquo;abonner \u00e0 un crochet,<\/li>\n<li>D\u00e9l\u00e9guer le travail \u00e0 une classe.<\/li>\n<\/ol>\n<p>Je sais que les cours sont cens\u00e9s faire \u00abbien une chose \u00bb, mais que se passe-t-il si cette seule chose est la d\u00e9l\u00e9gation ?<\/p>\n<blockquote>\n<p>confier (pouvoirs, fonctions, etc.) \u00e0 un autre en qualit\u00e9 de mandataire<\/p>\n<p><a href=\"https:\/\/www.dictionary.com\/browse\/delegate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le dictionnaire<\/a><\/p>\n<\/blockquote>\n<p>Et pour valider correctement une fonctionnalit\u00e9 \u00e0 un autre agent ou, dans notre cas, \u00e0 une classe, vous devez avoir la capacit\u00e9 de savoir ce que vous d\u00e9l\u00e9guez. Parfois, pour faire une chose, vous devez conna\u00eetre plusieurs informations.<\/p>\n<p>Alors, \u00e0 quoi cela ressemble-t-il pratiquement? Imaginez que vous ayez un <code>[AbstractSubscriber](https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/Subscriber\/AbstractSubscriber.php)<\/code>pour prendre le nom d&rsquo;un crochet dans son constructeur :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of Remove Empty Shortcodes.\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace TomMcFarlinRESCSubscriber;\n\nuse TomMcFarlinUtilitiesRegistry;\n\n\/**\n * An abstract implementation of a subscriber that requires a hook and the ability to\n * start the class.\n *\/\nabstract class AbstractSubscriber\n{\n    \/**\n     * @var string a reference to the hook to which the subscriber should be registered\n     *\/\n    protected $hook;\n\n    \/**\n     * @var Registry a reference to the simple container used to maintain plugin objects\n     *\/\n    protected $registry;\n\n    \/**\n     * @param string $hook the hook to which the subscriber is registered\n     *\/\n    public function __construct(string $hook)\n    {\n        $this-&gt;hook = $hook;\n        $this-&gt;registry = apply_filters('rescRegistry', null);\n    }\n\n    \/**\n     * @return string the hook to which the subscriber is registered\n     *\/\n    public function getHook(): string\n    {\n        return $this-&gt;hook;\n    }\n\n    abstract public function load();\n}<\/code><\/pre>\n<p>Et puis une fois que c&rsquo;est fait, la <code>load<\/code>fonction enverra le travail \u00e0 une classe responsable de faire le traitement.<\/p>\n<p>Prenez, par exemple, <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/WordPress\/PostContentProcessor.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ce code<\/a> de <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Remove Empty Shortcodes<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of Remove Empty Shortcodes.\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace TomMcFarlinRESCWordPress;\n\n\/**\n * Processes the post content by looking to see if any orphaned shortcode\n * exists and then removes it from displaying it from the user.\n *\/\nclass PostContentProcessor\n{\n    \/**\n     * A reference to the Shortcode Manager for processing orphaned shortcodes.\n     *\/\n    private $shortcodeManager;\n\n    \/**\n     * Initializes the class by setting up a reference to the Registry and the\n     * Shortcode Manager.\n     *\/\n    public function __construct()\n    {\n        $registry = apply_filters('rescRegistry', null);\n        $this-&gt;shortcodeManager = $registry-&gt;get('shortcodeManager');\n    }\n\n    \/**\n     * @param string $content the filtered post content\n     *\n     * @return string $content the filtered post content without the shortcode\n     *\/\n    public function run(string $content): string\n    {\n        return $this-&gt;shortcodeManager-&gt;processShortcodes($content);\n    }\n}<\/code><\/pre>\n<p>Une classe s&rsquo;abonne \u00e0 un \u00e9v\u00e9nement particulier, tel que <code>[the_content](https:\/\/developer.wordpress.org\/reference\/functions\/the_content\/)<\/code>, puis d\u00e9l\u00e8gue le travail \u00e0 la classe de post-traitement du contenu.<\/p>\n<p>Cela permet litt\u00e9ralement au fichier d&rsquo;amor\u00e7age du plugin d&rsquo;instancier le d\u00e9l\u00e9gu\u00e9. Le d\u00e9l\u00e9gu\u00e9 se connecte ensuite \u00e0 WordPress et lorsque WordPress arrive au bon point d&rsquo;ex\u00e9cution, le d\u00e9l\u00e9gu\u00e9 envoie la responsabilit\u00e9 \u00e0 la classe responsable du traitement.<\/p>\n<p>Cette architecture enti\u00e8re est non seulement compl\u00e8tement r\u00e9utilisable (voir l&rsquo;utilisation d&rsquo;une classe abstraite ci-dessus), mais elle nous permet de d\u00e9coupler la logique de domaine de WordPress et de la tester de mani\u00e8re isol\u00e9e.<\/p>\n<h2>En savoir plus sur la s\u00e9paration des pr\u00e9occupations<\/h2>\n<p>J&rsquo;ai \u00e9crit d&rsquo;autres articles sur la s\u00e9paration des pr\u00e9occupations\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/tommcfarlin.com\/separation-of-concerns-with-wordpress-templates\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">S\u00e9paration des pr\u00e9occupations avec les mod\u00e8les WordPress<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/separation-of-concerns-with-queries-and-helper-functions\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">S\u00e9paration des pr\u00e9occupations avec les requ\u00eates et les fonctions d&rsquo;assistance<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/programmation-wordpress-separer-les-preoccupations\/\" title=\"Programmation WordPress: S\u00e9parer les pr\u00e9occupations\">Programmation WordPress: S\u00e9parer les pr\u00e9occupations<\/a><\/li>\n<\/ul>\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>N&rsquo;oubliez pas que WordPress utilise le mod\u00e8le de conception pilot\u00e9 par les \u00e9v\u00e9nements et bien que nous nous r\u00e9f\u00e9rions souvent aux actions et aux filtres, le concept se r\u00e9sume \u00e0 des crochets. Le flux de contr\u00f4le \u00e0 travers le programme va quelque chose\u2026<\/p>\n","protected":false},"author":1,"featured_media":158739,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,717,832,841,862],"tags":[1167],"class_list":["post-231905","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231905","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=231905"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231905\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/158739"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}