{"id":232206,"date":"2023-01-04T13:48:00","date_gmt":"2023-01-04T10:48:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232206"},"modified":"2023-01-04T13:49:47","modified_gmt":"2023-01-04T10:49:47","slug":"disaccoppiamento-della-logica-di-dominio-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/disaccoppiamento-della-logica-di-dominio-in-wordpress\/","title":{"rendered":"Disaccoppiamento della logica di dominio in WordPress"},"content":{"rendered":"\n<p>Ricorda che WordPress utilizza il <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">modello di progettazione basato sugli eventi<\/a> e sebbene spesso ci riferiamo ad azioni e filtri, il concetto si riduce agli hook. Il flusso di controllo attraverso il programma \u00e8 pi\u00f9 o meno questo:<\/p>\n<ol>\n<li>Eseguire il programma,<\/li>\n<li>Ogni volta che il programma si trova su un hook (in WordPress, vedremo <code>do_action<\/code>o <code>apply_filters<\/code>), scorrere tutti gli hook registrati,<\/li>\n<li>Riporta il controllo al programma,<\/li>\n<li>Esegui fino alla fine.<\/li>\n<\/ol>\n<p>Questo non \u00e8 completamente diverso dal modello Publisher\/Subscriber (o <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PubSub<\/a>, in breve) ma c&#8217;\u00e8 una differenza fondamentale: il modello Event-Driven segnala semplicemente che \u00e8 successo qualcosa e se ci sono hook, si attiveranno. Il modello PubSub dir\u00e0 a un abbonato registrato di fare qualcosa.<\/p>\n<p>Ad ogni modo, torniamo agli hook in WordPress. Mantenere i due concetti di hook che abbiamo pu\u00f2 essere fatto pi\u00f9 facilmente pensandoli in questo modo:<\/p>\n<ul>\n<li>Le azioni servono a fare qualcosa,<\/li>\n<li>I filtri servono per l&#8217;elaborazione dei dati.<\/li>\n<\/ul>\n<p>Se stai cercando di avvicinarti allo sviluppo di WordPress in modo orientato agli oggetti, accoppiare strettamente il tuo codice al core di WordPress registrando le tue classi tramite hook all&#8217;applicazione principale non \u00e8 una buona idea.<\/p>\n<p>In altre parole, non registrare la tua logica aziendale con WordPress. Tienili separati. Ecco una cartina di tornasole per verificare se il tuo lavoro \u00e8 strettamente accoppiato con WordPress: se non puoi eseguire uno unit test contro la tua classe senza caricare WordPress, \u00e8 strettamente accoppiato.<\/p>\n<p>Allora qual \u00e8 la soluzione? Delegazione.<\/p>\n<h2>Logica di dominio in WordPress<\/h2>\n<p>La logica di dominio e la logica di business sono intercambiabili per quanto mi riguarda, quindi se hai letto i post precedenti su questo e ne ho parlato in diversi modi, sai perch\u00e9.<\/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=\"Disaccoppiamento della logica di dominio in WordPress\"><\/a><\/p>\n<p><a href=\"https:\/\/unsplash.com\/photos\/guiQYiRxkZY\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Credito<\/a><\/p>\n<p>Successivamente, l&#8217;idea di delegare la logica da WordPress a una classe per la logica di dominio in WordPress viene eseguita da una classe intermedia che \u00e8 responsabile di quanto segue:<\/p>\n<ol>\n<li>Sottoscrivendo un hook,<\/li>\n<li>Delegare il lavoro a una classe.<\/li>\n<\/ol>\n<p>So che le lezioni dovrebbero fare &quot;una cosa bene&quot;, ma cosa succederebbe se quella cosa fosse la delega?<\/p>\n<blockquote>\n<p>impegnarsi (poteri, funzioni, ecc.) a un altro come agente<\/p>\n<p><a href=\"https:\/\/www.dictionary.com\/browse\/delegate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il dizionario<\/a><\/p>\n<\/blockquote>\n<p>E per affidare correttamente la funzionalit\u00e0 a un altro agente o, nel nostro caso, a una classe, devi avere la capacit\u00e0 di sapere cosa stai delegando. A volte, per fare una cosa \u00e8 necessario conoscere diverse informazioni.<\/p>\n<p>Quindi, che aspetto ha in pratica parlando? Immagina di avere un <code>[AbstractSubscriber](https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/Subscriber\/AbstractSubscriber.php)<\/code>a prender\u00e0 il nome di un hook nel suo costruttore:<\/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>E poi, una volta terminato, la <code>load<\/code>funzione invier\u00e0 il lavoro a una classe responsabile dell&#8217;effettiva esecuzione dell&#8217;elaborazione.<\/p>\n<p>Prendi, ad esempio, <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/WordPress\/PostContentProcessor.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo codice<\/a> da <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>Una classe si iscrive a un evento particolare, ad esempio <code>[the_content](https:\/\/developer.wordpress.org\/reference\/functions\/the_content\/)<\/code>, e quindi delega il lavoro alla classe di elaborazione del contenuto successivo.<\/p>\n<p>Ci\u00f2 consente letteralmente al file di bootstrap del plug-in di creare un&#8217;istanza del delegato. Il delegato si collega quindi a WordPress e quando WordPress arriva al punto di esecuzione corretto, il delegato invia la responsabilit\u00e0 alla classe responsabile dell&#8217;elaborazione.<\/p>\n<p>L&#8217;intera architettura non solo \u00e8 completamente riutilizzabile (vedi l&#8217;uso di una classe astratta sopra), ma ci consente di disaccoppiare la logica di dominio da WordPress e testarla in isolamento.<\/p>\n<h2>Altro sulla separazione delle preoccupazioni<\/h2>\n<p>Ho scritto altri post sulla separazione delle preoccupazioni:<\/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\">Separazione delle preoccupazioni con i modelli 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\">Separazione delle preoccupazioni con query e funzioni di supporto<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/programmazione-wordpress-separare-le-preoccupazioni\/\" title=\"Programmazione WordPress: separare le preoccupazioni\">Programmazione WordPress: separare le preoccupazioni<\/a><\/li>\n<\/ul>\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>Ricorda che WordPress utilizza il modello di progettazione basato sugli eventi e sebbene spesso ci riferiamo ad azioni e filtri, il concetto si riduce agli hook. Il flusso di controllo attraverso il programma va qualcosa&#8230;<\/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":[918,896,835,720,844,865],"tags":[1168],"class_list":["post-232206","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-guida-per-principianti","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232206","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=232206"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232206\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/158739"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=232206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=232206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=232206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}