{"id":230896,"date":"2022-12-04T13:05:00","date_gmt":"2022-12-04T10:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230896"},"modified":"2022-11-10T00:29:38","modified_gmt":"2022-11-09T21:29:38","slug":"utilizzo-del-modello-di-registro-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/utilizzo-del-modello-di-registro-in-wordpress\/","title":{"rendered":"Utilizzo del modello di registro in WordPress"},"content":{"rendered":"\n<p>Ho avuto alcune conversazioni con vari amici e altri su Twitter sulla nozione di variabili globali nei linguaggi di programmazione. Per coloro che sono nuovi alla programmazione o che non sono sicuri del motivo per cui sono cattivi:<\/p>\n<blockquote>\n<p>L&#8217;uso di variabili globali rende il software pi\u00f9 difficile da leggere e capire. Poich\u00e9 qualsiasi codice in qualsiasi punto del programma pu\u00f2 modificare il valore della variabile in qualsiasi momento, la comprensione dell&#8217;uso della variabile pu\u00f2 comportare la comprensione di gran parte del programma.<\/p>\n<\/blockquote>\n<p>Questo non vuol dire <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Global_variable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">che non abbiano il loro uso<\/a><\/strong>, ma se sei interessato alla programmazione orientata agli oggetti (specialmente in un&#8217;impostazione WordPress in cui utilizzerai PHP), allora \u00e8 importante capire alcune alternative migliori rispetto alle variabili globali.<\/p>\n<p>Cio\u00e8, ci sono modi per lavorare con il passaggio di dati all&#8217;interno dell&#8217;applicazione senza la necessit\u00e0 di variabili globali. E uno di questi \u00e8 il modello di registro.<\/p>\n<h2>Il modello di registro in WordPress<\/h2>\n<p>Innanzitutto, nota che i modelli di progettazione trascendono qualsiasi modello particolare. Finch\u00e9 un linguaggio offre i concetti di oggetti (o anche astrazioni), \u00e8 possibile implementare il modello.<\/p>\n<p>Ma perch\u00e9 preoccuparsi di usarlo?<\/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=\"Utilizzo del modello di registro in WordPress\" ><\/a><\/p>\n<p>Foto di Samuel Zeller su Unsplash<\/p>\n<p>In breve, fornisce un modo orientato agli oggetti per passare informazioni all&#8217;interno dell&#8217;applicazione senza la necessit\u00e0 di variabili globali. Anche cose come <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i contenitori di iniezione delle dipendenze<\/a><\/strong> vanno bene per questo, ma esulano dallo scopo di questo post. Direi anche che ci sono momenti in cui possono essere eccessivi nel contesto di piccoli plugin.<\/p>\n<h3>Implementazione del modello<\/h3>\n<p>Detto questo, come possiamo implementare il modello di registro in WordPress e quindi sfruttarlo durante il nostro lavoro? Diamo un&#8217;occhiata alla <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-00-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">struttura di base del modello,<\/a><\/strong> prima:<\/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>Si noti che la sua implementazione \u00e8 abbastanza semplice:<\/p>\n<ol>\n<li>La classe contiene un singolo array come propriet\u00e0 privata.<\/li>\n<li>I dati vengono aggiunti all&#8217;array con un ID specifico.<\/li>\n<li>I dati possono essere recuperati dal pattern con l&#8217;ID.<\/li>\n<\/ol>\n<p>Potresti anche portare questo modello particolare al livello successivo se accetta solo una classe di un certo tipo (come un AbstractEvent, ad esempio) e quindi invocare automaticamente una funzione sulla classe ogni volta che viene passata (o recuperata) dal registro.<\/p>\n<p>Ma questo sta entrando in un&#8217;implementazione pi\u00f9 complessa che mi piacerebbe per questo post.<\/p>\n<h3>Allestimento del Registro<\/h3>\n<p>A causa della natura del sistema di hook di WordPress, esiste un modo particolare in cui il registro deve essere configurato e quindi registrato con WordPress.<\/p>\n<p>Diciamo che stai lavorando con un plugin. All&#8217;interno del file bootstrap del plugin, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-01-register-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fai qualcosa del genere:<\/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>Questo crea il registro e quindi crea un filtro corrispondente che possiamo utilizzare in seguito nel plug-in per recuperare il registro e quindi altri oggetti che mantiene.<\/p>\n<h3>Utilizzo del Registro<\/h3>\n<p>Per aggiungere un oggetto al registro, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-02-adding-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">chiama la funzione add e passa un ID univoco e un&#8217;istanza dell&#8217;oggetto<\/a><\/strong>. Nota che la nostra attuale implementazione eliminer\u00e0 tutte le istanze precedenti di un oggetto che ha la stessa chiave e la sostituir\u00e0 con qualsiasi cosa gli passiamo.<\/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>Da l\u00ec, puoi quindi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-03-using-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">recuperare gli oggetti<\/a><\/strong> che avevi archiviato nel registro:<\/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>E puoi usarli proprio come farebbe oyu in qualsiasi altro modo. Ma questo evita la necessit\u00e0 di utilizzare singleton, variabili globali o altre cose pericolose.<\/p>\n<h2>Una parola sulla testabilit\u00e0<\/h2>\n<p>Un altro vantaggio che trovo con l&#8217;implementazione di questo modello \u00e8 che non solo ti consente di scrivere pi\u00f9 facilmente unit test contro di esso, ma ti d\u00e0 anche la possibilit\u00e0 di scrivere test contro gli oggetti che pu\u00f2 contenere.<\/p>\n<p>Con ci\u00f2, intendo dire che puoi scrivere le tue classi in modo pi\u00f9 indipendente da WordPress, separando cos\u00ec la logica del dominio dall&#8217;applicazione principale e rendendole pi\u00f9 rappresentative dei dati che dovrebbero mantenere.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esistono modi per lavorare con il passaggio di dati all&#8217;interno dell&#8217;applicazione senza la necessit\u00e0 di variabili globali. E uno di questi \u00e8 il modello di registro.<\/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":[896,720,844,865],"tags":[1168],"class_list":["post-230896","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230896","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=230896"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230896\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/163108"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}