In che modo Drupal gestisce il caricamento automatico delle classi?


10

In che modo Drupal gestisce il caricamento automatico delle classi attraverso i moduli? Ad esempio, se ho un modulo Eventi e dichiaro una classe chiamata Event, e quindi nel file .info includo il file di classe, come viene registrato?

Il problema è che sto cercando di ottenere dinamicamente un array contenente tutti i nomi di classe caricati. get_declared_classes () non restituisce i nomi di tutte le mie classi dichiarate in questo modo, quindi presumo che in qualche modo vengano caricate automaticamente. Seguendo i suggerimenti di un'altra domanda di overflow dello stack, ho provato a ottenerli tutti con spl_autoload_functions () , ma anche questo ha avuto esito negativo .

Qualche idea?

Risposte:


13

Tutti i file elencati nei file .info vengono analizzati quando i moduli vengono ricostruiti (solo i file modificati / nuovi in ​​tale elenco sono, per motivi di prestazioni).

Tali informazioni vengono quindi memorizzate nelle tabelle {registry}e {registry_files}. Pertanto, se si desidera ottenere tutte le classi o quelle in base a un determinato modello di denominazione, è possibile eseguire una query su tali tabelle.


7

Drupal mantiene un registro di codice e lo utilizza per le sue classi caricatore automatico. Per popolare questo registro con le classi del tuo modulo, devi aggiungere i loro file alla voce files [] nel suo file .info:

files[] = includes/Foo.inc
files[] = includes/Bar.inc

Il caricamento automatico della classe di PHP assicurerà che anche il file della classe genitore sia caricato.

Ringraziamo l'utente pier-buyle per questa risposta, vedi la sua risposta originale qui per la stessa domanda.

spero che aiuti


5

spl_autoload_functions()restituisce l'elenco delle funzioni di caricamento automatico che sono state registrate spl_autoload_register(). Drupal registra due funzioni di caricamento automatico: una per le classi ( drupal_autoload_class () ) e una per le interfacce ( drupal_autoload_interface () ).

Entrambe le funzioni usano _registry_check_code () ; usando il suo codice, puoi scrivere una funzione che elenca tutte le classi implementate dai moduli Drupal 7.


3

Se hai aggiunto una voce all'array files [] del file .info, dovrai andare nella sezione di amministrazione dei tuoi moduli e fare clic su "salva configurazione". Questo otterrà drupal per aggiornare le informazioni .info e le nuove voci saranno registrate.


1

Ho scoperto che dichiarare i miei file include nel file info non li riconosce quando inizio a eseguire il modulo. Se ho un evento di classe nel file event.inc. ma cassa un oggetto nel modulo, non viene riconosciuto. Aggiungo la linea

include_once ('CMatArticleHandler.inc');

prima della $ variabile = nuovo evento (); linea. Sono nuovo in questo, quindi potrebbe esserci qualcosa di più di questo, ma ha funzionato finora.


1
Davvero un peccato che la gente abbia semplicemente votato a favore invece di spiegare cosa fare per evitare di doverlo fare. Sono nella stessa situazione: il caricatore automatico di Drupal non riconosce costantemente la necessità di caricare un file per ottenere una classe.
Greggles,

È necessario cancellare il registro quando si aggiungono nuove classi. Un modo semplice per fare questo tramite drush è con questo comando: drupal.org/project/registry_rebuild
stefgosselin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.