Utilizzo di spazi dei nomi e caricamento automatico nei plugin WordPress, parte 4

Se questo è il primo tutorial che stai leggendo in questa serie, ti consiglio caldamente di riprendere quello che abbiamo trattato finora.

In sostanza, vieni alla fine dello spettacolo. A questo punto, abbiamo gettato le basi per il nostro plugin, scritto il plug-in, definito e analizzato namespace e autoloader. Non resta che applicare ciò che abbiamo imparato.

Quindi in questo tutorial, metteremo tutti i pezzi insieme. In particolare, rivedremo il codice sorgente del nostro plugin, lo spazio dei nomi di tutte le classi rilevanti e scriverò un caricatore automatico in modo da poter rimuovere tutte le nostre istruzioni di inclusione.

Discuterò tutto in dettaglio mentre lavoriamo attraverso il codice. Di nuovo, se questo è il primo tutorial che stai leggendo in questa serie, riprendi ciò che abbiamo visto finora e poi torna a questo tutorial.

Prima di scrivere qualsiasi codice

A questo punto, dovresti avere familiarità con il modo in cui abbiamo impostato il nostro ambiente di sviluppo. Come aggiornamento, ecco una breve panoramica del software che stiamo utilizzando:

  • almeno PHP 5.6.20
  • il server Web Apache
  • un server di database MySQL
  • WordPress 4.6.1
  • una conoscenza pratica dell'API Plugin WordPress

Avrai anche bisogno di una copia del codice sorgente del plugin con cui stiamo lavorando. Puoi prenderne una copia proprio qui. Supponendo che sia installato, attivato e che il tuo IDE sia in esecuzione, cominciamo.

Namespacing the Code

Ricordiamo il tutorial precedente, sono un fan per assicurarmi che i nostri spazi dei nomi seguano l'organizzazione dei file su disco. Se osservi la struttura delle directory del nostro plugin o se hai seguito la serie fino ad ora, dovresti vedere qualcosa del genere:

Nota che se hai configurato il tuo plugin in modo diverso, va bene. I tuoi spazi dei nomi saranno probabilmente diversi, ma ciò non dovrebbe influire su tutto ciò che è contemplato in questa serie.

Usando la struttura delle directory come linea guida, esaminiamo tutti i file PHP che compongono il nostro plugin e definiamo i loro spazi dei nomi. Fare questo è semplice: si tratta semplicemente di utilizzare la parola chiave namespace e posizionare un nome qualificato nella parte superiore di ciascun file.

Li elenco tutti sotto.

tutsplus-namespace-demo.php

class-meta-box.php

class-meta-box-display.php

Interfaccia-assets.php

class-css-loader.php

class-domanda-reader.php

Ci sono alcune cose da notare sulle convenzioni che ho usato sopra:

  • Lo spazio dei nomi di root è Tutsplus_Namespace_Demo, che corrisponde al nome della directory del plugin.
  • Il resto degli spazi dei nomi come Tutsplus_Namespace_Demo \ AdminTutsplus_Namespace_Demo \ Admin \ Util corrispondono anche alle rispettive directory; tuttavia, i nomi delle directory sono cased (rispetto a essere in lettere minuscole).

Infine, se hai provato ad aggiornare la pagina o hai provato a navigare su WordPress da quando hai introdotto le istruzioni namespace, allora probabilmente vedrai un errore nella tua console che assomiglia a qualcosa del genere:

E include il seguente messaggio:

Avviso PHP: call_user_func_array () si aspetta che il parametro 1 sia un callback valido, funzione 'tutsplus_namespace_demo' non trovata o nome funzione non valido in /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-includes/plugin.php sulla linea 524

O forse mostra:

Errore fatale PHP: Classe 'Meta_Box' non trovata in /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php on line 48

Oppure potresti vedere qualsiasi numero di altri messaggi di errore simili. Va bene. È normale.

Ma solleva la domanda: che succede con il nostro plugin? Fortunatamente niente. Questo è un comportamento previsto.

Il primo messaggio che vedi potrebbe essere il risultato di un altro plugin che hai installato. Non ero in grado di riprodurlo da solo; tuttavia, quando disattivo alcuni degli altri plug-in che ho in esecuzione, il plugin ha generato il secondo messaggio (che è il messaggio che volevo dimostrare).

Quando si scrive il codice del namespace, PHP si aspetta di localizzare una classe all'interno di un determinato spazio dei nomi. Concettualmente puoi pensare che le tue classi ora appartengano al loro pacchetto (o sotto pacchetto) o comunque tu lo definisca. E affinché una funzione possa accedere a una classe all'interno di un pacchetto, è necessario renderla consapevole dei pacchetti esistenti.

È qui che entra in gioco funzionalità di namespace e autoloading aggiuntive. Quindi, prima di provare ad accedere al nostro codice tramite i loro spazi dei nomi, lavoriamo su un caricatore automatico.

Tutto sul caricamento automatico

La scrittura di un caricatore automatico richiede quanto segue:

  1. comprensione di una funzione PHP chiamata spl_autoload_register
  2. scrivendo una funzione che caricherà automaticamente i nostri file con nomi
  3. compresa la nostra funzione di caricamento automatico personalizzato

Non lasciare che il nome spl_autoload_register intimidirti. Significa semplicemente che questa è una funzione che fa parte della "Libreria PHP standard" ed è il modo in cui "registriamo" una funzione di "autoload". È un boccone da dire e molti personaggi da scrivere, ma è solo una funzione che useremo per dire a PHP come analizzare spazi dei nomi e nomi di classe e dove può trovare i nostri file.

Questa funzione ci consente di scrivere il nostro codice personalizzato per il caricamento automatico dei file e quindi di agganciare la funzione in PHP. Cioè, stiamo dicendo a PHP dove trovare i nostri file e come analizzare spazi dei nomi, nomi di file e così via in modo che includa i file.

Detto questo, siamo pronti per scrivere un autoloader.

Scrivere un caricatore automatico

Quando scrivi un autoloader, la cosa da tenere a mente è come sono organizzati i nostri file. Cioè, vogliamo sapere come mappare i nostri namespace alle nostre directory. 

Nell'esempio che stiamo utilizzando, è semplice: gli spazi dei nomi sono versioni con involucro della struttura delle directory. Questo non è sempre vero per altri progetti; tuttavia, è ancora un altro motivo per cui mi piace organizzare logicamente i miei file in base alla loro posizione fisica.

Quando PHP tenta di caricare una classe, il nostro autoloader dovrà eseguire quanto segue:

  1. Dividi lo spazio dei nomi in base alle barre.
  2. Suddividi il pacchetto e i pacchetti secondari in base ai caratteri di sottolineatura e sostituiscili con i trattini (se necessario).
  3. Sapere come associare nomi di classi, interfacce e così via ai nomi dei file.
  4. Creare una rappresentazione di stringa del nome file in base alle informazioni di cui sopra.
  5. Includi il file.

Con tutti questi punti, il nostro lavoro è stato risolto per noi. Nella directory dei plugin, creare una sottodirectory chiamata inc, e nel inc directory crea un file chiamato autoload.php.

All'interno di quel file, andiamo avanti e annulliamo la funzione che useremo per caricare automaticamente i nostri file. Dovrebbe assomigliare a qualcosa di simile a questo:

Ovviamente, questo non sta ancora facendo nulla.

Una nota a margine sulla scrittura di un caricatore automatico

Nota che scriverò il codice e i commenti del codice per spiegare a fondo cosa stiamo facendo. Se ti stai appena avventurando da solo per la prima volta, scrivere un caricatore automatico e utilizzare spazi dei nomi e lavorare con i file potrebbe essere un po 'frustrante. Questo è dove un debugger e l'utilizzo di file di registro possono tornare utili. 

Questo è al di fuori dello scopo di questo tutorial, ma sappi che scrivere un caricatore automatico non è qualcosa che potresti avere ragione la prima volta che lo stai facendo.

Completamento del caricatore automatico

Iniziamo ad aggiungere alcune funzionalità dati i passaggi elencati all'inizio di questa sezione.

Innanzitutto, è necessario impostare un ciclo che esegua l'iterazione all'indietro attraverso le parti del nome file che vengono passate nella funzione di caricamento automatico. Lo facciamo perché rende più facile costruire un percorso per il caricamento automatico del file.

 0; $ i--) // Altro a venire ... 

Dopo questo, dobbiamo guardare il $ file_parts e sostituisci tutte le occorrenze del trattino basso con un trattino perché tutti i nostri nomi di classe e l'interfaccia usano caratteri di sottolineatura mentre i nostri nomi di file utilizzano i trattini.

Le seguenti due righe sono le prime due righe all'interno del ciclo che abbiamo soppresso sopra:

Successivamente, avremo bisogno di un condizionale che faccia alcune cose.

  1. Ha bisogno di controllare per vedere quale voce del percorso del nome del file che stiamo leggendo.
  2. Se siamo alla prima voce, allora siamo al nome del file; altrimenti, siamo nel suo spazio dei nomi.
  3. Successivamente, se stiamo leggendo la prima voce, dobbiamo determinare se stiamo cercando di caricare automaticamente un'interfaccia o stiamo caricando una classe.
  4. Se è il primo, allora dobbiamo modificare il nome dell'interfaccia in modo che venga caricato correttamente in base al suo nome file; altrimenti, caricaremo la classe in base al valore nel file $ corrente variabile.

Sembra molto, ma non dovrebbe essere terribilmente complicato da leggere. Vedi il codice commentato qui sotto:

Fatto questo, è tempo di creare un percorso completo per il file. Fortunatamente, questo è poco più della semplice concatenazione di stringhe:

Infine, dobbiamo assicurarci che il file esista. In caso contrario, verrà visualizzato un messaggio di errore standard di WordPress:

E a questo punto, abbiamo un autoloader completo (che può essere recuperato scaricando i file dal link nella barra laterale di questo post in quanto il codice sorgente sarebbe un po 'lungo da postare qui nel tutorial).

Infine, è importante notare che questa particolare funzione potrebbe (o dovrebbe) essere riscritta come una classe. Inoltre, la classe dovrebbe essere composta da diverse funzioni più piccole delle quali sono testabili, hanno una singola responsabilità e leggere più chiaramente di ciò che è sopra. Forse in un tutorial bonus, descriverò il processo di come sarebbe.

Ma stiamo ancora includendo i file

Se guardi vicino alla parte superiore del file del plugin principale (o al file di bootstrap che abbiamo spesso chiamato), noterai diversi includere affermazioni che assomigliano a questo:

Visto il lavoro che abbiamo svolto fino a questo punto, possiamo finalmente rimuovere queste affermazioni e sostituirle con una sola:

Per essere chiari, lo stiamo sostituendo con il nostro autoloader. A questo punto, dovremmo fare con il nostro plugin.

Mettere tutto insieme

Ora che abbiamo assegnato il nostro codice al namespace per fornire un'organizzazione logica delle classi correlate e scritto un autoloader per includere automaticamente i file in base allo spazio dei nomi e al percorso di ogni classe, dovremmo essere in grado di avviare il nostro plugin e farlo funzionare esattamente come ha fatto durante la prima iterazione riuscita.

L'ultima cosa che dobbiamo fare è assicurarsi di aggiornare il file di bootstrap in modo da istruire PHP a utilizzare gli spazi dei nomi per Meta_Box, Meta_Box_Display, il Question_Reader, e il CSS_Loader.

dentro(); $ Meta_box-> init (); 

Nota nel codice sopra stiamo usando PHP uso parola chiave e stiamo anteponendo i nomi delle classi con i loro subpackages immediati. Puoi leggere ulteriori informazioni sull'uso nel manuale, ma in breve è:

Il uso la parola chiave deve essere dichiarata nell'ambito più esterno di un file (l'ambito globale) o all'interno delle dichiarazioni dello spazio dei nomi. Questo perché l'importazione viene eseguita in fase di compilazione e non in fase di runtime, quindi non può essere a scopo di blocco. 

Detto questo e supponendo che tutto funzioni correttamente, dovresti essere in grado di navigare verso Aggiungi nuovo post pagina (o Modifica postpagina, visualizza la nostra meta-box e visualizza un messaggio di domanda nella parte superiore della barra laterale:

Se è così, allora congratulazioni. Hai configurato correttamente il tuo plug-in per i tuoi spazi dei nomi e il caricamento automatico. In caso contrario, ricontrolla il codice con quello che abbiamo condiviso qui, controlla i log degli errori e assicurati che nulla sia fuori dall'ordinario nella schermata di amministrazione di WordPress.

Se tu fare vedere qualcosa, le probabilità sono che ha a che fare con qualcosa di minore. Rivedi il codice che abbiamo trattato, confrontalo con quello che è allegato qui a questo post (nella barra laterale insieme al grande pulsante blu), e vedi se riesci a restringere il problema.

Conclusione

A questo punto, abbiamo raggiunto la fine della nostra serie. Durante gli ultimi quattro tutorial, abbiamo coperto molti aspetti:

  • Abbiamo creato un plug-in che richiede agli utenti domande per aiutare a dare il via al loro blog.
  • Abbiamo usato le funzioni PHP per leggere i file dal filesystem e renderli sul display.
  • Abbiamo definito spazi dei nomi e autoloading e abbiamo esaminato il modo in cui possono essere applicati.
  • Abbiamo organizzato il nostro codice e scritto il nostro autoloader, rendendo il codice più leggibile, organizzato e meno ingombrante.

In definitiva, gran parte del materiale coperto in questa serie può essere utilizzato in progetti esistenti e futuri sui quali potresti lavorare. 

Ricorda che puoi trovare altri prodotti correlati a WordPress nel nostro marketplace. E se vuoi saperne di più sullo sviluppo di soluzioni per WordPress, puoi trovare tutti i miei tutorial e serie sulla mia pagina del profilo. Non esitare a seguirmi sul mio blog o su Twitter mentre discuto quasi quotidianamente lo sviluppo di software nel contesto di WordPress.

E ricorda, il link è per il download del codice sorgente finale è nella barra laterale sotto un pulsante intitolato Scarica allegato. Naturalmente, non esitate a fare domande nei commenti!

risorse

  • spl_autoload_register
  • uso