{"id":231524,"date":"2022-12-18T14:17:00","date_gmt":"2022-12-18T11:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231524"},"modified":"2022-12-18T14:20:43","modified_gmt":"2022-12-18T11:20:43","slug":"widget-wordpress-refactoring-parte-6","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-refactoring-parte-6\/","title":{"rendered":"Widget WordPress: refactoring, parte 6"},"content":{"rendered":"\n<p>Dovresti essere esperto nel refactoring che stiamo facendo per quanto riguarda il WordPress Widget Boilerplate. In caso contrario, ti consiglio di recuperare il ritardo sulla serie fino a questo momento:<\/p>\n<ul>\n<li>leggendo <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-5\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il post precedente<\/a> ,<\/li>\n<li>o leggendo <a href=\"https:\/\/tommcfarlin.com\/tag\/wordpress-widgets-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&#8217;intera serie<\/a> fino a questo punto,<\/li>\n<li>e guardando <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il ramo di sviluppo del progetto<\/a> su GitHub.<\/li>\n<\/ul>\n<p>Per quanto riguarda la base di codice, siamo a buon punto in questo momento. Abbiamo iniziato a refactoring gran parte del codice in classi pi\u00f9 piccole e pi\u00f9 mirate. E abbiamo appena impostato un registro in modo da poter iniziare a lavorare con istanze di oggetti in tutto il plug-in senza la necessit\u00e0 di un accoppiamento eccessivo.<\/p>\n<p>Ma c&#8217;\u00e8 ancora un problema che stiamo affrontando e riguarda gli spazi dei nomi e il caricamento automatico. Ne ho parlato un po&#8217; <a href=\"https:\/\/wordpress.mediadoma.com\/it\/spazi-dei-nomi-e-caricamento-automatico-in-wordpress\/\" title=\"un paio di anni fa,\">un paio di anni fa,<\/a> ma non per quanto riguarda Composer.<\/p>\n<p>Ed \u00e8 quello che vedremo in questo post.<\/p>\n<h2>The WordPress Widget Boilerplate: Refactoring, Parte 6<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-refactoring-parte-2\/\" title=\"Nel secondo post di questa serie\">Nel secondo post di questa serie<\/a>, abbiamo iniziato a parlare di Composer. Se chiedi alla maggior parte degli sviluppatori PHP (inclusi quelli che lavorano su WordPress), \u00e8 probabile che sentirai che Composer \u00e8 un gestore di pacchetti o un gestore di dipendenze.<\/p>\n<p>In breve, \u00e8 un modo per noi di portare librerie di terze parti nel nostro progetto e quindi utilizzare le loro funzionalit\u00e0 (quindi non dobbiamo scrivere il nostro codice per farlo).<\/p>\n<p>Ma c&#8217;\u00e8 un&#8217;altra funzionalit\u00e0 che Composer offre che \u00e8 di immensa utilit\u00e0 soprattutto quando si utilizzano molte classi e <strong>non si<\/strong> desidera utilizzare le istruzioni require_once in tutta la base di codice.<\/p>\n<p>E questo \u00e8 il caricatore automatico.<\/p>\n<h3>Il caricatore automatico definito<\/h3>\n<p>Direttamente dal <a href=\"https:\/\/getcomposer.org\/doc\/01-basic-usage.md#autoloading\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">manuale:<\/a><\/p>\n<blockquote>\n<p>Per le librerie che specificano le informazioni di caricamento automatico, Composer genera un <code>vendor\/autoload.php<\/code>file. Puoi semplicemente includere questo file e iniziare a utilizzare le classi fornite da quelle librerie senza alcun lavoro aggiuntivo:<\/p>\n<\/blockquote>\n<p>Se hai seguito il codice finora, vedrai che in realt\u00e0 stiamo gi\u00e0 utilizzando il caricatore automatico generato da Composer.<\/p>\n<p>Per prima cosa, abbiamo definito <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la configurazione necessaria<\/a> :<\/p>\n<pre><code>{\n    \"name\": \"wordpress-widget-boilerplate\/wordpress-widget-boilerplate\",\n    \"description\": \"An organized, maintainable boilerplate for building widgets using WordPress best practices.\",\n    \"type\": \"wordpress-plugin\",\n    \"license\": \"GPL-3.0-or-later\",\n    \"homepage\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\",\n    \"authors\": [\n      {\n        \"name\": \"Tom McFarlin\",\n        \"email\": \"tom@pressware.co\",\n        \"homepage\": \"https:\/\/pressware.co\"\n      }\n    ],\n    \"support\": {\n      \"issues\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/issues\"\n    },\n    \"config\": {\n      \"preferred-install\": \"dist\",\n      \"platform\": {\n          \"php\": \"7.1\"\n      }\n    },\n    \"repositories\": [\n      {\n        \"type\": \"composer\",\n        \"url\": \"https:\/\/wpackagist.org\"\n      }\n    ],\n    \"require\": {\n      \"php\": \"7.1\",\n      \"composer\/installers\": \"^1.4\"\n    },\n    \"require-dev\": {\n        \"friendsofphp\/php-cs-fixer\": \"^2.13.1\",\n        \"jakub-onderka\/php-parallel-lint\": \"^1.0.0\",\n        \"phpmd\/phpmd\": \"^v2.6.0\",\n        \"nikic\/php-parser\": \"^4.0\",\n        \"ocramius\/proxy-manager\": \"^2.0.0\",\n        \"phpro\/grumphp\": \"^0.13.1\"\n    },\n    \"scripts\": {\n      \"test\": [\n        \".\/vendor\/bin\/grumphp run\"\n      ]\n    },\n    \"minimum-stability\": \"stable\"\n  }<\/code><\/pre>\n<p>Quindi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-01-plugin-boostrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">abbiamo iniziato a includerlo nel bootstrap del plugin<\/a> (che finalizziamo oggi):<\/p>\n<pre><code>&lt;?php\n\n\/\/ Include the autoloader.\n\/\/ TODO: Note this has not yet been defined.\nrequire_once __DIR__. '\/inc\/autoload.php';\n<\/code><\/pre>\n<p>Ma c&#8217;\u00e8 un problema qui: come carichiamo solo le classi di cui abbiamo bisogno per la distribuzione?<\/p>\n<p>Per dirla in altro modo: ci sono molte librerie che stiamo usando in fase di sviluppo per assicurarci di scrivere codice di alta qualit\u00e0 e conforme agli standard. Ma non vogliamo distribuire 10 MB di dati a coloro che utilizzano il nostro progetto.<\/p>\n<p>Invece, dobbiamo includere solo i file richiesti, giusto? E per farlo, dobbiamo assicurarci di generare un caricatore automatico che possiamo includere che faccia proprio questo.<\/p>\n<p>Per prima cosa, ti mostrer\u00f2 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-02-composer-distribution-command-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il comando<\/a>, quindi spiegher\u00f2 cosa fa:<\/p>\n<pre><code>$ composer install --no-dev --no-ansi --no-interaction --optimize-autoloader --no-progress --prefer-dist<\/code><\/pre>\n<p>Questo generer\u00e0 proprio ci\u00f2 di cui abbiamo bisogno per far funzionare il nostro progetto in un ambiente di produzione. Ecco cosa fa ogni bandiera:<\/p>\n<ul>\n<li><strong>installazione del compositore<\/strong>. Questo installa semplicemente tutte le dipendenze. Se ne hai gi\u00e0 un certo numero nella directory del fornitore, questo rimuover\u00e0 tutti tranne quelli richiesti.<\/li>\n<li><strong>no-dev<\/strong>. Ci\u00f2 impedir\u00e0 a Composer di installare i pacchetti nella sezione <strong>require-dev<\/strong> dei suoi file di configurazione (vale a dire, le dipendenze che stiamo usando con GrumPHP).<\/li>\n<li><strong>no-ansi.<\/strong> Ci\u00f2 impedisce che si verifichi qualsiasi output ANSI. Potrebbe non interessarti eseguirlo o meno. Se scegli di eseguire un tipo di distribuzione automatica, utilizzalo; in caso contrario, pu\u00f2 essere omesso dal comando.<\/li>\n<li><strong>nessuna interazione<\/strong>. Questo \u00e8 un altro flag che viene utilizzato specificamente per gli ambienti in cui si desidera creare automaticamente il progetto e non \u00e8 necessario impegnarsi con domande, output e cose del genere.<\/li>\n<li><strong>ottimizza-caricatore automatico<\/strong>. In breve, questo genera un caricatore automatico pi\u00f9 veloce. Potrebbe volerci un po&#8217; di tempo per l&#8217;esecuzione a seconda delle dimensioni del tuo progetto, ma ripaga quando avvii il tuo lavoro.<\/li>\n<li><strong>nessun progresso<\/strong>. Ci\u00f2 nasconde la barra di avanzamento dalla visualizzazione nel terminale. Potresti davvero voler vedere questo e, se \u00e8 cos\u00ec, \u00e8 fantastico; tuttavia, alcuni ambienti potrebbero non gestire bene determinati caratteri (come backspace).<\/li>\n<li><strong>prefer-dist<\/strong>. Ci\u00f2 assicurer\u00e0 che i pacchetti installati vengano eseguiti utilizzando la versione di distribuzione (rispetto a qualcosa che \u00e8 meno stabile).<\/li>\n<\/ul>\n<h4>Ancora interessato?<\/h4>\n<p>Se sei davvero curioso di ottimizzare il caricatore automatico per progetti al di fuori di questo post, ti consiglio di leggere <a href=\"https:\/\/getcomposer.org\/doc\/articles\/autoloader-optimization.md\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questa pagina<\/a> nella documentazione di Composer. Non rientra nell&#8217;ambito di ci\u00f2 che stiamo facendo qui, ma potrebbe tornare utile con altri lavori che hai ora o che farai in futuro.<\/p>\n<h2>Com&#8217;\u00e8 questo aspetto in Boilerplate?<\/h2>\n<p>Se stai lavorando su Boilerplate sul tuo computer locale, potresti vedere qualcosa del genere:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161015-61e719e23bf2d.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-161015-61e719e23bf2d.png\" alt=\"Widget WordPress: refactoring, parte 6\"><\/a><\/p>\n<p>Ma se esegui il comando incluso sopra, vedrai qualcosa del genere:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161015-61e719e5afd5a.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-161015-61e719e5afd5a.png\" alt=\"Widget WordPress: refactoring, parte 6\"><\/a><\/p>\n<p>Questa \u00e8 una grande differenza e questo \u00e8 un piccolo progetto. Immagina di fare qualcosa di molto pi\u00f9 grande che verr\u00e0 eseguito in produzione.<\/p>\n<p>Parlando per esperienza, posso dirti che i progetti possono raggiungere rapidamente 20 MB o pi\u00f9 di dipendenze se stai utilizzando una variet\u00e0 di librerie di terze parti per cose come la registrazione, le richieste HTTP e gli strumenti di qualit\u00e0 del codice.<\/p>\n<h2>Includeremo nella nostra directory dei fornitori?<\/h2>\n<p>Le persone spesso diranno che non dovresti includere la directory del fornitore nel controllo del codice sorgente e con una buona ragione: pu\u00f2 essere enorme.<\/p>\n<p>Anche la documentazione di Composer <a href=\"https:\/\/getcomposer.org\/doc\/faqs\/should-i-commit-the-dependencies-in-my-vendor-directory.md\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">parla di questo:<\/a><\/p>\n<blockquote>\n<p>La procedura migliore \u00e8 quindi fare in modo che tutti gli sviluppatori utilizzino Composer per installare le dipendenze. Allo stesso modo, il server di compilazione, CI, gli strumenti di distribuzione ecc. Dovrebbero essere adattati per eseguire Composer come parte del bootstrap del progetto.<\/p>\n<\/blockquote>\n<p>Allora cosa dovremmo fare? Abbiamo bisogno del caricatore automatico e abbiamo bisogno di determinate dipendenze perch\u00e9 i nostri utenti non sapranno eseguire (n\u00e9 dovrebbero eseguire!) Composer ogni volta che scaricano il nostro lavoro.<\/p>\n<p>A causa della natura di WordPress e del lavoro che stiamo facendo, dovremo impegnare la directory del fornitore ma solo con requisiti molto determinati.<\/p>\n<ol>\n<li>Creeremo un ramo che verr\u00e0 utilizzato per il rilascio (lo chiameremo in modo creativo <strong>rilascio<\/strong> e potremo unirci lo <strong>sviluppo<\/strong> quando necessario).<\/li>\n<li>Ci assicureremo che la directory del fornitore non faccia parte del file gitignore; tuttavia, ci assicureremo che le directory .git all&#8217;interno della directory del fornitore vengano ignorate (che possono comunque occupare molto spazio).<\/li>\n<\/ol>\n<p>Quindi eseguiamo ogni passaggio e vediamo come appare quando abbiamo finito.<\/p>\n<h3>Creazione del ramo di rilascio<\/h3>\n<p>Per creare un nuovo ramo dall&#8217;interno del terminale, immettere <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-03-create-a-branch-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il seguente comando<\/a> :<\/p>\n<pre><code>$ git checkout -b release<\/code><\/pre>\n<p>Questo prender\u00e0 tutto il codice su cui stiamo lavorando e quindi creer\u00e0 un nuovo ramo con esso. Poich\u00e9 questo sar\u00e0 il ramo che useremo per agire come quello che useranno i nostri utenti (parleremo di <strong>master<\/strong> in un prossimo post).<\/p>\n<p>Innanzitutto, rivedi il tuo file composer.json e assicurati che includa quanto segue:<\/p>\n<pre><code>\"autoload\": {\n    \"psr-4\": {\n        \"WordPressWidgetBoilerplate\": \"src\/\",\n        \"WordPressWidgetBoilerplateSubscriber\": \"src\/Subscriber\/\",\n        \"WordPressWidgetBoilerplateUtilities\": \"src\/Utilities\/\",\n        \"WordPressWidgetBoilerplateViews\": \"src\/Views\/\"\n    }\n},<\/code><\/pre>\n<p>Ora dobbiamo assicurarci di eseguire il comando Composer sopra per assicurarci che nient&#8217;altro che ci\u00f2 di cui abbiamo bisogno sia nella directory del <strong>fornitore<\/strong>.<\/p>\n<pre><code>$ composer install --no-dev --no-ansi --no-interaction --optimize-autoloader --no-progress --prefer-dist<\/code><\/pre>\n<p>Ora dobbiamo aggiornare gitignore.<\/p>\n<h3>Aggiornare ci\u00f2 che ignoriamo<\/h3>\n<p>E se hai seguito sia la serie che il post fino a qui, allora sai che assomiglier\u00e0 a questo (potrebbe includere pi\u00f9 o meno ma dovrebbe includere almeno questo).<\/p>\n<p>Per me, questo sembra <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-05-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il seguente<\/a> :<\/p>\n<pre><code>*.DS_Store\n*.log\nwp-config.php\nwp-content\/advanced-cache.php\nwp-content\/backup-db\/\nwp-content\/backups\/\nwp-content\/blogs.dir\/\nwp-content\/cache\/\nwp-content\/upgrade\/\nwp-content\/uploads\/\nwp-content\/mu-plugins\/\nwp-content\/wp-cache-config.php\nwp-content\/plugins\/hello.php\n\n\/.htaccess\n\/license.txt\n\/readme.html\n\/sitemap.xml\n\/sitemap.xml.gz\n\n\/vendor\/**\/.git\n\/vendor\/bin\ncomposer.lock\n<\/code><\/pre>\n<p>A seconda che tu stia utilizzando un terminale o un client, vedrai che ci sono nuovi file di cui eseguire il commit (dalla directory del fornitore, in particolare). Quindi aggiungi quelli al tuo ramo.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-06-pushing-a-new-branch-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Quindi salva le modifiche<\/a>. Potrebbe essere necessario specificare quanto segue se si lavora nel terminale:<\/p>\n<pre><code>$ git push --set-upstream origin release<\/code><\/pre>\n<p>E con ci\u00f2, il tuo codice dovrebbe funzionare ed essere disponibile su GitHub (o qualsiasi servizio di controllo del codice sorgente che stai utilizzando). Puoi vedere cosa ho a disposizione <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/release\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">qui<\/a>.<\/p>\n<h2>Aggiunta di funzionalit\u00e0<\/h2>\n<p>Ora che abbiamo tutti i pezzi necessari a posto, \u00e8 ora di iniziare a usare Composer, il caricatore automatico, le nostre classi astratte e il nostro Registro per iniziare ad aggiungere alcune funzionalit\u00e0 di base a WordPress Widget Boilerplate in modo da avere qualcosa da mostrare per il nostro lavoro .<\/p>\n<p>Per i pi\u00f9 curiosi, in questo momento ho intenzione di mantenere le filiali organizzate come tali:<\/p>\n<ul>\n<li><strong>master<\/strong> sar\u00e0 ci\u00f2 che \u00e8 disponibile per chiunque voglia creare un widget WordPress,<\/li>\n<li><strong>lo sviluppo<\/strong> \u00e8 strettamente per gli sviluppatori include coloro che sanno come usare Composer e gli argomenti discussi in questo post,<\/li>\n<li><strong>release<\/strong> \u00e8 ci\u00f2 che verr\u00e0 utilizzato per fornire una demo funzionante.<\/li>\n<\/ul>\n<p>Per ora, per\u00f2, rivedi ci\u00f2 che \u00e8 trattato in questo post e lo riprenderemo nel prossimo post.<\/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>C&#8217;\u00e8 un problema che stiamo affrontando con gli spazi dei nomi e il caricamento automatico ed \u00e8 quello che esamineremo in questo post.<\/p>\n","protected":false},"author":1,"featured_media":223641,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[720],"tags":[1168],"class_list":["post-231524","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sviluppatore","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231524","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=231524"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231524\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223641"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}