Modello di fabbrica rispetto all'istanza di classe dinamica in PHP

3

Sto sviluppando un framework web in PHP, e voglio renderlo completamente estendibile. Il mio obiettivo è di consentire a uno sviluppatore di modificare il comportamento di qualsiasi componente senza dover modificare affatto la base di codice "core". Gli sviluppatori dovrebbero essere in grado di incapsulare tutto il loro lavoro in una directory separata. E, voglio farlo senza usare "ganci" (cioè, ascoltatori di eventi), che possono trasformarsi rapidamente in un immenso casino.

Per la maggior parte dei componenti, ho capito:

  • Il brufolo del contenitore DI ti consente di extend di servizi esistenti.
  • Sto utilizzando Twig come motore di template, che consente la sovrascrittura dei modelli.
  • Le route del controller anteriore possono essere ridefinite ridefinendole.
  • Sto utilizzando un localizzatore di risorse uniformi per consentire agli sviluppatori di eseguire l'override o aggiungere percorsi di ricerca per le risorse (risorse, configurazione, schema, ecc.)

Il problema che sto affrontando è l'estensione della funzionalità di una classe quando ci sono posti nella base di codice principale che già istanziano quella classe (perché il mio framework è un'applicazione a pieno titolo piuttosto che una libreria, anche con IoC, ho ancora bisogno di istanziare la classe in qualche punto ).

L'ereditarietà da sola non risolverà questo problema, perché sto ancora creando un'istanza della classe base nei miei controller / percorsi / percorsi principali. Sembrerebbe che ho bisogno di introdurre un ulteriore livello di astrazione.

Un'idea che ho è semplicemente usare la funzione di istanza di classi dinamiche di PHP. Ad esempio, se ho una classe base User , e voglio consentire agli sviluppatori di sostituire tutte le istanze con una classe CustomUser :

// In a config file (which *can* be overridden) 
$userClassName = "User";

...

// Anywhere I need a User, or User subclass: 
$user = new $userClassName(...);

Ora, uno sviluppatore deve semplicemente sovrascrivere il valore di $userClassName e impostarlo sul nome della classe figlia.

In alternativa, potrei completare tutto in uno schema di fabbrica:

class UserFactory
{
    public function createUser($type = "User", $args)
    {
        return new $type($args);
    }
}

Il vantaggio della classe Factory sarebbe che potevo fare un controllo dei tipi, ma poi avrei bisogno di una Factory separata per ogni classe base.

I due approcci sono il modo giusto per implementare questo tipo di estensibilità?

    
posta alexw 12.08.2016 - 19:16
fonte

0 risposte

Leggi altre domande sui tag