{"id":230722,"date":"2022-11-29T15:50:00","date_gmt":"2022-11-29T12:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230722"},"modified":"2022-11-29T15:54:01","modified_gmt":"2022-11-29T12:54:01","slug":"scrivere-unit-test-con-phpunit-parte-3-configurazione-xml","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/scrivere-unit-test-con-phpunit-parte-3-configurazione-xml\/","title":{"rendered":"Scrivere Unit Test con PHPUnit, Parte 3: Configurazione XML"},"content":{"rendered":"\n<p>Nei post precedenti di questa serie, ho trattato i seguenti due argomenti:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/scrivere-unit-test-con-phpunit-parte-1-il-set-up\/\" title=\"Scrivere Unit Test con PHPUnit, Parte 1: Il Set-Up\">Scrivere Unit Test con PHPUnit, Parte 1: Il Set-Up<\/a><strong>.<\/strong> Una guida per iniziare a scrivere test PHPUnit attraverso l&#8217;uso di una cache di base e utilizzando il metodo setUp del framework.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/scrivere-unit-test-con-phpunit-parte-2-the-tear-down\/\" title=\"Scrivere unit test con PHPUnit, parte 2: The Tear Down.\">Scrivere unit test con PHPUnit, parte 2: The Tear Down.<\/a> Un tutorial su come scrivere unit test che sfruttano correttamente i metodi setUp e tearDown di PHPUnit.<\/li>\n<\/ol>\n<p>Ciascuno dei precedenti ha lo scopo di fornire un primer su come iniziare a scrivere test unitari di base. Le cose possono diventare pi\u00f9 complesse soprattutto con la crescita di un&#8217;applicazione o di un progetto (ma \u00e8 sempre vero, giusto?).<\/p>\n<p>Ma per essere sicuri che uno sia preparato per questo, c&#8217;\u00e8 un componente finale per lo unit test su cui credo dovremmo concentrarci ed \u00e8 la comprensione del file di configurazione XML PHPUnit (che potresti aver visto in altri progetti come phpunit.xml).<\/p>\n<h2>Configurazione XML dell&#8217;unit\u00e0 PHP<\/h2>\n<p>Quindi, in questo post, configurer\u00f2 un semplice progetto che utilizza PHPUnit, scrive alcuni test come quelli che abbiamo gi\u00e0 visto e sfrutta un file di configurazione per automatizzare i test.<\/p>\n<p>Inoltre, far\u00f2 il possibile per spiegare al meglio le parti necessarie del file di configurazione in modo che tu possa includerne uno nel tuo prossimo progetto.<\/p>\n<h3>1 Eliminare i file<\/h3>\n<p>Prima di iniziare a scrivere effettivamente codice verificabile, \u00e8 importante conoscere i file che saranno necessari per far funzionare il processo.<\/p>\n<p>Quanto segue \u00e8, pi\u00f9 o meno, come <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">organizziamo<\/a><\/strong> le cose dall&#8217;inizio di un progetto:<\/p>\n<ul>\n<li>una directory per i test,<\/li>\n<li>il file <strong>phpunit.xml<\/strong><\/li>\n<\/ul>\n<p>Alla fine vedrai anche:<\/p>\n<ul>\n<li>i file che compongono il progetto,<\/li>\n<li>i test che verificano detti file.<\/li>\n<\/ul>\n<p>A questo punto, per\u00f2, diamo un&#8217;occhiata al file di configurazione XML e poi tentiamo di eseguire PHPUnit automaticamente senza altri parametri.<\/p>\n<h3>2 Nozioni di base per il file di configurazione<\/h3>\n<p>Per prima cosa, diamo un&#8217;occhiata al <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-00-phpunit-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">file di configurazione di base:<\/a><\/strong><\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n\n&lt;!-- http:\/\/phpunit.de\/manual\/4.1\/en\/appendixes.configuration.html --&gt;\n&lt;phpunit xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"http:\/\/schema.phpunit.de\/4.1\/phpunit.xsd\"\n         bootstrap=\".\/tests\/bootstrap.php\"\n         backupGlobals=\"false\"\n         colors=\"true\"\n         convertErrorsToExceptions=\"true\"\n         convertNoticesToExceptions=\"true\"\n         convertWarningsToExceptions=\"true\"\n&gt;\n  &lt;testsuites&gt;\n    &lt;testsuite name=\"AcmeTests\"&gt;\n      &lt;directory&gt;.\/tests&lt;\/directory&gt;\n    &lt;\/testsuite&gt;\n  &lt;\/testsuites&gt;\n\n  &lt;logging&gt;\n    &lt;log type=\"coverage-text\" target=\"php:\/\/stdout\" showUncoveredFiles=\"true\"&gt;&lt;\/log&gt;\n  &lt;\/logging&gt;\n&lt;\/phpunit&gt;\n<\/code><\/pre>\n<p>Ora capiamo cosa esattamente stiamo guardando (diverso dal semplice XML).<\/p>\n<ul>\n<li><strong>phpunit<\/strong>. Il nodo padre svolge il solito lavoro di definizione dello schema per il file XML, ma ci sono alcuni altri componenti di cui ci occupiamo in particolare:\n<ul>\n<li><strong>backupGlobals.<\/strong> Questo \u00e8 in realt\u00e0 correlato a un&#8217;annotazione che possiamo fare nel nostro codice sorgente. I globali sono qualcosa che dovremmo cercare di evitare nella programmazione orientata agli oggetti, ma se scegli di usarne uno o devi usarne uno, questo dir\u00e0 a PHPUnit di gestire i valori che le variabili globali stanno mantenendo (e ti dar\u00e0 la possibilit\u00e0 di ripristinare loro). In genere lo lascio cos\u00ec com&#8217;\u00e8.<\/li>\n<li><strong>bootstrap.<\/strong> Questo \u00e8 facoltativo, ma se scegli di includere altri file con i tuoi test (come l&#8217;inserimento di una libreria beffarda, parte di WordPress o una libreria di terze parti), allora questo sar\u00e0 tutto per te per definire la posizione dello script che deve eseguire. Deridere e introdurre WordPress non rientra nell&#8217;ambito di questo post, ma \u00e8 qualcosa che probabilmente esamineremo in futuro poich\u00e9 \u00e8 utile durante il test dei plug-in. Per ora, includer\u00f2 un semplice caricatore automatico che fondamentalmente aggiunge tutti i file nella radice della directory del progetto. La fonte completa sar\u00e0 condivisa pi\u00f9 avanti in questo post.<\/li>\n<li><strong>colori.<\/strong> Se desideri che la console stampi un rapporto dei tuoi test e lo faccia utilizzando i colori (per aiutare a identificare pi\u00f9 facilmente avvisi, avvisi, errori e cos\u00ec via), impostalo su true.<\/li>\n<li>I seguenti sono tutti valori booleani. Raccomando di impostarli su <strong>true<\/strong> per i rapporti pi\u00f9 aggressivi possibili. In questo modo, non te la caverai semplicemente vedendo scivolare avvisi o avvisi mentre ti preoccupi solo degli errori. Questo \u00e8 pi\u00f9 un esercizio sulla qualit\u00e0 del codice che altro.\n<ul>\n<li><strong>convertErrorsToExceptions<\/strong><\/li>\n<li><strong>convertNoticesToExceptions<\/strong><\/li>\n<li><strong>convertWarningsToExceptions<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>le testsuite<\/strong> sono costituite da raccolte di test. Poich\u00e9 un determinato progetto pu\u00f2 avere pi\u00f9 test, \u00e8 importante assicurarsi di assegnare a ciascuna suite un nome univoco e fare riferimento al percorso corretto del gruppo di test. Per il nostro esempio, avremo solo una singola suite di test e si trova nella directory <strong>test<\/strong>.<\/li>\n<li><strong>la registrazione<\/strong> \u00e8 una funzionalit\u00e0 che pu\u00f2 essere semplice come stampare i dati nella console o utilizzare una libreria di terze parti (come <strong><a href=\"https:\/\/confluence.atlassian.com\/clover\/clover-documentation-home-71598318.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Clover<\/a><\/strong>) per generare report che aiutano con l&#8217;integrazione continua. Dal momento che devo ancora discutere di quest&#8217;ultimo in nessuno dei miei post precedenti, continueremo con la console come metodo principale di output. Pertanto, abbiamo php <strong>:\/\/stdout<\/strong> come unico output di registrazione.<\/li>\n<\/ul>\n<p>Detto questo, il nostro file XML ha tutto ci\u00f2 di cui PHPUnit ha bisogno per funzionare senza altri parametri.<\/p>\n<p>Ricorda, tuttavia, prima di procedere con il resto di questo articolo, presumo che tu abbia installato PHPUnit a livello globale sul tuo sistema utilizzando Composer. In caso contrario, rivedi <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/compositore-per-wordpress-parte-1\/\" title=\"questo articolo\">questo articolo<\/a><\/strong> in quanto ti fornir\u00e0 le istruzioni su come farlo.<\/p>\n<p>Una volta fatto, puoi verificare che PHPUnit sia installato inserendo il seguente comando nel tuo terminale:<\/p>\n<pre><code>$ which phpunit<\/code><\/pre>\n<p>E dovresti vedere qualcosa come il seguente:<\/p>\n<\/p>\n<p>Se vedi qualcosa di simile a quanto sopra, puoi eseguire PHPUnit ovunque dal tuo sistema.<\/p>\n<h3>3 Il file Bootstrap<\/h3>\n<p>Prima di andare oltre, scriviamo un file bootstrap di base. Lo chiameremo <strong>bootstrap.php<\/strong> e lo rilasceremo nella nostra directory <strong>test<\/strong>. Includer\u00e0 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-01-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">quanto segue:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/\/ This array has a single file but could whole the contents of an entire directory.\n$files = [\n    dirname(__DIR__).'\/AcmeCache.php',\n];\n\nforeach ($files as $file) {\n    if (file_exists($file)) {\n        require_once $file;\n    }\n}\n<\/code><\/pre>\n<p>Questo \u00e8 un semplice &quot;caricatore automatico&quot; (che io lo chiamo con esitazione dato che sta solo scorrendo i file e richiedendoli, ma funziona per i nostri scopi).<\/p>\n<p>A questo punto, impostiamo un test di base.<\/p>\n<h3>4 Un test di base fallito<\/h3>\n<p>Se leggi qualcosa sullo sviluppo basato su test, probabilmente sentirai parlare di un ciclo rosso-verde-ripetitivo. C&#8217;\u00e8 molto da dire a riguardo e consiglio <strong><a href=\"http:\/\/blog.cleancoder.com\/uncle-bob\/2014\/12\/17\/TheCyclesOfTDD.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">di leggerlo<\/a><\/strong>, ma non \u00e8 lo scopo di questo post.<\/p>\n<p>Invece, siamo pi\u00f9 concentrati sulla scrittura di test che corrispondono a ci\u00f2 che dobbiamo fare, giusto? Quindi, detto questo, facciamo quanto segue:<\/p>\n<ol>\n<li>crea una directory da cui avrai alcuni file PHP di base che testeremo,<\/li>\n<li>nella radice della directory, crea anche <strong>phpunit.xml<\/strong> e popolalo usando il codice condiviso in precedenza in questo post<\/li>\n<li>creare una directory <strong>test<\/strong> in cui collocheremo i nostri test.<\/li>\n<\/ol>\n<p>Ora, dal Terminale, cambia la directory nella directory del progetto (che \u00e8 certamente mancante, per ora) e quindi esegui semplicemente <strong>php<em><\/em><\/strong> unit<em><\/em>:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>Supponendo che tutto sia impostato correttamente, dovresti vedere qualcosa del genere:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7588ea742f.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-163700-61e7588ea742f.png\" alt=\"Scrivere Unit Test con PHPUnit, Parte 3: Configurazione XML\"><\/a><\/p>\n<p>Dal momento che non abbiamo codice e test, vedremo naturalmente l&#8217;output sopra, giusto? Quindi scriviamo un singolo test che verr\u00e0 eseguito (e fallito) poich\u00e9 non c&#8217;\u00e8 codice da testare effettivamente.<\/p>\n<p>Innanzitutto, nella directory <strong>test<\/strong> crea un file chiamato <strong>AcmeCacheTest.php.<\/strong> E facciamogli fare qualcosa di semplice come <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">istanziare un oggetto cache<\/a><\/strong> che alla fine creeremo.<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n}\n<\/code><\/pre>\n<p>Prima di eseguire il test, notare che:<\/p>\n<ol>\n<li>Assicurati di <strong>utilizzare PHPUnitFrameworkTestCase<\/strong><\/li>\n<li>E chiedi alla nostra classe di <strong>estendere TestCase<\/strong><\/li>\n<\/ol>\n<p>Questo fa parte di ci\u00f2 che rende l&#8217;utilizzo di PHPUnit cos\u00ec semplice. Una volta fatto, esegui il codice seguente dalla radice del tuo progetto:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>Dopodich\u00e9, dovresti vedere quanto segue:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e75891b9ec8.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-163700-61e75891b9ec8.png\" alt=\"Scrivere Unit Test con PHPUnit, Parte 3: Configurazione XML\"><\/a><\/p>\n<p>Nota che questo produrr\u00e0 un test fallito e ti dir\u00e0 <strong>dove<\/strong> \u00e8 stato trovato il problema, il file e la riga.<\/p>\n<p>Per risolvere questo problema, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-04-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dobbiamo scrivere una classe:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nclass AcmeCache\n{\n    private $duration;\n\n    public function __construct()\n    {\n        $this-&gt;duration = 43200;\n    }\n\n    public function setDuration(int $duration)\n    {\n        $this-&gt;duration = $duration;\n    }\n\n    public function getDuration(): int\n    {\n        return $this-&gt;duration;\n    }\n}\n<\/code><\/pre>\n<h3>4 Alcuni test di base e di superamento<\/h3>\n<p>Il test di superamento di base (che sar\u00e0 basato sul codice precedente) includer\u00e0 quanto segue:<\/p>\n<ul>\n<li>un file con spazio dei nomi,<\/li>\n<li>rappresenter\u00e0 una semplice cache,<\/li>\n<li>verr\u00e0 caricato automaticamente da PHPUnit utilizzando il file <strong>bootstrap.php<\/strong> condiviso sopra<\/li>\n<li>e avr\u00e0 una durata impostata nel suo costruttore insieme a un setter e un getter per il valore<\/li>\n<\/ul>\n<p>Per prima cosa, verifichiamo che siamo in grado di impostare la classe e che non sia nulla. Questa \u00e8 un&#8217;affermazione un po &#8216;non necessaria poich\u00e9 sappiamo che avremo una classe correttamente istanziata, ma ci fa entrare nel solco <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">della scrittura di test:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n}\n<\/code><\/pre>\n<p>Ed esegui il test:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e75894bbad2.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-163700-61e75894bbad2.png\" alt=\"Scrivere Unit Test con PHPUnit, Parte 3: Configurazione XML\"><\/a><\/p>\n<p>Quindi, verifichiamo che il valore predefinito della <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cache sia impostato:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n\n    public function testDefaultCacheValue()\n    {\n        $this-&gt;assertSame(43200, $this-&gt;cache-&gt;getDuration());\n    }\n}\n<\/code><\/pre>\n<p>Come per il passaggio precedente, esegui i test e ora dovresti vedere due test superati:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7589770dbe.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-163700-61e7589770dbe.png\" alt=\"Scrivere Unit Test con PHPUnit, Parte 3: Configurazione XML\"><\/a><\/p>\n<p>Infine, proviamo per vedere se siamo in grado di <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">modificare correttamente il valore:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n\n    public function testDefaultCacheValue()\n    {\n        $this-&gt;assertSame(43200, $this-&gt;cache-&gt;getDuration());\n    }\n\n    public function testSetCustomDuration()\n    {\n        $duration = 4200;\n\n        $this-&gt;cache-&gt;setDuration($duration);\n        $this-&gt;assertSame($duration, $this-&gt;cache-&gt;getDuration());\n    }\n}\n<\/code><\/pre>\n<p>E le ultime tre prove superate:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7589a7745a.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-163700-61e7589a7745a.png\" alt=\"Scrivere Unit Test con PHPUnit, Parte 3: Configurazione XML\"><\/a><\/p>\n<p>E il gioco \u00e8 fatto:<\/p>\n<ol>\n<li>un file XML PHPUnit,<\/li>\n<li>un semplice bootstrap,<\/li>\n<li>una singola classe con namespace,<\/li>\n<li>unit test per ogni metodo della classe<\/li>\n<\/ol>\n<p>Certo, \u00e8 semplice, ma questo pone le basi per molto di pi\u00f9 di quello che molte persone gi\u00e0 fanno con i loro test.<\/p>\n<p>Inoltre, ti d\u00e0 qualcosa su cui costruire man mano che le tue capacit\u00e0 di prova diventano pi\u00f9 forti.<\/p>\n<h2>C&#8217;\u00e8 di pi\u00f9? (Sempre giusto?)<\/h2>\n<p>Infine, se sei ansioso di immergerti davvero nel file di configurazione, puoi leggere la spiegazione <strong><a href=\"https:\/\/phpunit.de\/manual\/6.5\/en\/appendixes.configuration.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">approfondita del manuale al riguardo.<\/a><\/strong><\/p>\n<p>Nota, tuttavia, tutto ci\u00f2 che \u00e8 descritto sopra mira ad essere ci\u00f2 di cui hai bisogno per iniziare a configurare il tuo file di configurazione XML PHPUnit.<\/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>Una guida fondamentale per comprendere il file di configurazione XML di PHPUnit e come collegarlo a un pi\u00f9 semplice unit test.<\/p>\n","protected":false},"author":1,"featured_media":163701,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[804,720,844],"tags":[1168],"class_list":["post-230722","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-6","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230722","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=230722"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/163701"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}