Come scoprire una classe in PHP in modo dinamico, proprio come un'architettura plug-in

1

Sto riscontrando un problema comune in PHP (e nella maggior parte degli altri linguaggi) al momento, in cui i sistemi che sto progettando devono essere aggiornati in più punti per aggiungere nuove funzionalità, mentre mi piacerebbe avere un nucleo, dove Posso aggiungere nuove funzionalità, plug-in ecc. Senza dover toccare il codice principale.

Un esempio potrebbe essere un menu di navigazione, in cui il menu carica gli elementi dalla directory o dallo spazio dei nomi X. Il mio obiettivo è che una volta che io o un altro sviluppatore aggiungo un nuovo file, estende una classe MenuItem, a seconda di quale deve essere, la classe caricando il menu scoprirai questo nuovo file e visualizzalo, senza mai dover toccare il codice di caricamento del menu principale.

Il meglio che ho trovato finora è:

function get_menu_items() {
    $menu_items = array();
    $raw_files = scandir(DOCUMENT_ROOT . '/menu/menu_items');
    foreach($raw_files as $file){
        require_once($file);
        $class_name = substr($file, 0, -4); // cut away the '.php'
        $menu_items []= new $class_name();
    }
    return $menu_items;
}

Ma quanto sopra sembra sbagliato in quanto non dovrei controllare una directory per l'esistenza di file per le funzionalità! Immagino che questo sia un modello di design comune come wordpress potrebbe essere utilizzato per la scoperta dei plugin? Ho cercato per un po 'ma non sono stato in grado di migliorare quanto sopra! Qualsiasi aiuto sarebbe molto apprezzato !!

    
posta John 28.01.2014 - 14:09
fonte

1 risposta

0

Anche se la tua soluzione funziona in linea di principio, è estremamente lenta a causa dell'uso dell'API File-system e piuttosto vulnerabile. Ad esempio, in teoria, posso utilizzare il tuo caricamento del profilo foto per iniettare un file PHP con estensione .jpg e spostarlo nella directory dei plug-in e lasciare che l'applicazione lo carichi per me.

Potresti non notare la lentezza dell'utilizzo dell'API del file system - su un semplice sito Web / CMS con un paio di utenti online allo stesso tempo, e nessuno potrebbe nemmeno tentare di attaccare la tua applicazione web, tuttavia, se stai cercando una soluzione robusta , ti incoraggio vivamente a trovare una soluzione che ti dia Control su quali file vengono utilizzati / caricati dal tuo script .

Ad esempio è possibile memorizzare tutti i nuovi plug-in in un file JSON e utilizzare tale file come valida fonte di plug-in installati per il proprio script. In questo modo, ciò di cui hai realmente bisogno è aggiungere il file alla directory e aggiungere semplicemente una coppia chiave / valore al tuo file JSON. Non ci vorrà molto tempo, comunque dirò molto.

Una soluzione basata su database può essere un'idea migliore se devi consentire a una persona non tecnica di scegliere tra i plug-in, tuttavia nel tuo esempio potrebbe essere eccessivo.

    
risposta data 22.04.2014 - 09:18
fonte

Leggi altre domande sui tag