{"id":230607,"date":"2022-12-04T12:43:00","date_gmt":"2022-12-04T09:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230607"},"modified":"2022-11-09T23:10:28","modified_gmt":"2022-11-09T20:10:28","slug":"utilisation-du-modele-de-registre-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/utilisation-du-modele-de-registre-dans-wordpress\/","title":{"rendered":"Utilisation du mod\u00e8le de registre dans WordPress"},"content":{"rendered":"\n<p>J&rsquo;ai eu quelques conversations avec divers amis et d&rsquo;autres sur Twitter \u00e0 propos de la notion de variables globales dans les langages de programmation. Pour ceux qui d\u00e9butent dans la programmation ou qui ne savent pas pourquoi ils sont mauvais\u00a0:<\/p>\n<blockquote>\n<p>L&rsquo;utilisation de variables globales rend le logiciel plus difficile \u00e0 lire et \u00e0 comprendre. \u00c9tant donn\u00e9 que n&rsquo;importe quel code n&rsquo;importe o\u00f9 dans le programme peut modifier la valeur de la variable \u00e0 tout moment, comprendre l&rsquo;utilisation de la variable peut impliquer de comprendre une grande partie du programme.<\/p>\n<\/blockquote>\n<p>Cela ne veut pas dire <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Global_variable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">qu&rsquo;ils n&rsquo;ont pas leur utilit\u00e9<\/a><\/strong>, mais si vous \u00eates int\u00e9ress\u00e9 par la programmation orient\u00e9e objet (en particulier dans un environnement WordPress o\u00f9 vous allez utiliser PHP), il est important de comprendre de meilleures alternatives que les variables globales.<\/p>\n<p>Autrement dit, il existe des moyens de travailler avec la transmission de donn\u00e9es autour de votre application sans avoir besoin de variables globales. Et l&rsquo;un de ces moyens est le mod\u00e8le de registre.<\/p>\n<h2>Le mod\u00e8le de registre dans WordPress<\/h2>\n<p>Tout d&rsquo;abord, notez que les mod\u00e8les de conception transcendent tout mod\u00e8le particulier donn\u00e9. Tant qu&rsquo;un langage offre les concepts d&rsquo;objets (ou m\u00eame d&rsquo;abstractions), alors il est possible d&rsquo;impl\u00e9menter le mod\u00e8le.<\/p>\n<p>Mais pourquoi s&#8217;emb\u00eater \u00e0 l&rsquo;utiliser ?<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163107-61e74a43bb7bf.jpg\" 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-163107-61e74a43bb7bf.jpg\" alt=\"Utilisation du mod\u00e8le de registre dans WordPress\" ><\/a><\/p>\n<p>Photo de Samuel Zeller sur Unsplash<\/p>\n<p>En bref, il fournit un moyen orient\u00e9 objet de transmettre des informations autour de votre application sans avoir besoin de variables globales. Des \u00e9l\u00e9ments tels que <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">les conteneurs d&rsquo;injection de d\u00e9pendances<\/a><\/strong> sont \u00e9galement utiles pour cela, mais ils d\u00e9passent le cadre de cet article. Je dirais \u00e9galement qu&rsquo;il y a des moments o\u00f9 ils peuvent \u00eatre exag\u00e9r\u00e9s dans le contexte de petits plugins.<\/p>\n<h3>Impl\u00e9mentation du mod\u00e8le<\/h3>\n<p>Cela dit, comment pouvons-nous impl\u00e9menter le mod\u00e8le de registre dans WordPress, puis en tirer parti tout au long de notre travail? Examinons d&rsquo; abord <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-00-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la structure de base du mod\u00e8le<\/a><\/strong>\u00a0:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Serves as a registry for all objects that need to be accessed globally throughout the\n * plugin.\n *\/\nclass Registry\n{\n\n  \/**\n   * @var array The array used to the the various objects that will be used in the plugin.\n   *\/\n  private $storage;\n\n  \/**\n   * Initializes the plugin by creating an instance of an empty array.\n   *\/\n  public function __construct()\n  {\n      $this-&gt;storage = [];\n  }\n\n  \/**\n   * Adds an instance of a class to the registry's storage array using the given key\n   *\n   * @param string $id    The ID of the object to be used to retrieve it later in the plugin.\n   * @param mixed  $class An instance of the class that will be associated with the specified key.\n   *\/\n  public function add($id, $class)\n  {\n      $this-&gt;storage[$id] = $class;\n  }\n\n  \/**\n   * @param string $id    The ID of the object to retrieve from the repository.\n   * @return mixed $class An instance of the class associated with the specified key (or null if it doesn't exist).\n   *\/\n  public function get($id)\n  {\n      return array_key_exists($id, $this-&gt;storage)? $this-&gt;storage[$id]: null;\n  }\n}<\/code><\/pre>\n<p>Notez que sa mise en \u0153uvre est assez simple\u00a0:<\/p>\n<ol>\n<li>La classe contient un seul tableau en tant que propri\u00e9t\u00e9 priv\u00e9e.<\/li>\n<li>Les donn\u00e9es sont ajout\u00e9es au tableau avec un ID sp\u00e9cifique.<\/li>\n<li>Les donn\u00e9es peuvent \u00eatre r\u00e9cup\u00e9r\u00e9es \u00e0 partir du mod\u00e8le avec l&rsquo;ID.<\/li>\n<\/ol>\n<p>Vous pouvez m\u00eame faire passer ce mod\u00e8le particulier au niveau sup\u00e9rieur s&rsquo;il n&rsquo;accepte qu&rsquo;une classe d&rsquo;un certain type (comme un AbstractEvent, par exemple), puis invoquer automatiquement une fonction sur la classe chaque fois qu&rsquo;elle est transmise (ou r\u00e9cup\u00e9r\u00e9e) du registre.<\/p>\n<p>Mais cela entre dans une impl\u00e9mentation plus complexe que j&rsquo;aimerais pour ce post.<\/p>\n<h3>Configuration du Registre<\/h3>\n<p>En raison de la nature du syst\u00e8me de hook de WordPress, il existe une mani\u00e8re particuli\u00e8re de configurer le registre, puis de l&rsquo;enregistrer aupr\u00e8s de WordPress.<\/p>\n<p>Disons que vous travaillez avec un plugin. Dans le fichier d&rsquo;amor\u00e7age du plugin, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-01-register-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">faites quelque chose comme ceci\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Creates a Registry using the Registry Design Pattern to store objects\n * that can be used throughout the plugin.\n *\n *\/\n$registry = new Registry();\nadd_filter('acmeRegistry', function() use ($registry) {\n  return $registry;\n});<\/code><\/pre>\n<p>Cela cr\u00e9e le registre, puis cr\u00e9e un filtre correspondant que nous pouvons utiliser plus tard dans le plugin pour r\u00e9cup\u00e9rer le registre et donc d&rsquo;autres objets qu&rsquo;il maintient.<\/p>\n<h3>Utilisation du registre<\/h3>\n<p>Pour ajouter un objet au registre, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-02-adding-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">appelez la fonction add et transmettez un ID unique et une instance de l&rsquo;objet<\/a><\/strong>. Notez que notre impl\u00e9mentation actuelle supprimera toutes les instances pr\u00e9c\u00e9dentes d&rsquo;un objet qui a la m\u00eame cl\u00e9 et la remplacera par tout ce que nous lui transmettrons.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Get an reference to the repository and add an instance of a \n * PostManager to it. The PostManager is a class that allows us\n * to manipulate posts.\n *\/\n$this-&gt;registry = apply_filters('acmeRegistry', null);\n$this-&gt;registry-&gt;add('postManager', new PostManager());<\/code><\/pre>\n<p>De l\u00e0, vous pouvez ensuite <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-03-using-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">r\u00e9cup\u00e9rer les objets<\/a><\/strong> que vous aviez stock\u00e9s dans le registre\u00a0:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Get an reference to the repository, get a reference to the PostManager\n * then you can begin working with it.\n *\/\n$this-&gt;registry = apply_filters('acmeRegistry', null);\n$this-&gt;registry-&gt;add('postManager', new PostManager());\n\n\/\/ An example call that you can make to set the title of the post.\n$postManager-&gt;updateTitle('This Is the New Title');\n<\/code><\/pre>\n<p>Et vous pouvez les utiliser comme vous le feriez de toute autre mani\u00e8re. Mais cela \u00e9vite le besoin d&rsquo;utiliser des singletons, des variables globales ou d&rsquo;autres choses dangereuses.<\/p>\n<h2>Un mot sur la testabilit\u00e9<\/h2>\n<p>Un autre avantage que je trouve avec l&rsquo;impl\u00e9mentation de ce mod\u00e8le est qu&rsquo;il vous permet non seulement d&rsquo;\u00e9crire plus facilement des tests unitaires sur lui, mais il vous donne \u00e9galement la possibilit\u00e9 d&rsquo;\u00e9crire des tests sur les objets qu&rsquo;il peut contenir.<\/p>\n<p>J&rsquo;entends par l\u00e0 que vous pouvez \u00e9crire vos classes de mani\u00e8re plus ind\u00e9pendante de WordPress, s\u00e9parant ainsi la logique du domaine de l&rsquo;application principale et les rendant plus repr\u00e9sentatives des donn\u00e9es qu&rsquo;elles sont cens\u00e9es conserver.<\/p>\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>Il existe des moyens de travailler avec la transmission de donn\u00e9es autour de votre application sans avoir besoin de variables globales. Et l&rsquo;un de ces moyens est le mod\u00e8le de registre.<\/p>\n","protected":false},"author":1,"featured_media":163108,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,841,862],"tags":[1167],"class_list":["post-230607","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230607","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=230607"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230607\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/163108"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}