Sto refactoring una vecchia libreria Codeigniter per essere indipendente dal framework php. Ci sono queste parti principali:
-
l'oggetto di connessione - questo verrà da "utente"; cioè, la connessione del framework o la propria libreria di connessione. La mia libreria non vorrà "saperlo" tranne che (inizialmente) sarà un oggetto conn PDO (ma le cose dovrebbero essere scritte per gestire un tipo di driver nativo)
-
l'oggetto modello - esegue le query e amp; restituisce matrice di risultati (o array di errori) alla lib principale. Come è ora, è molto "sottile" e ha solo transazioni, creazione di query e amp; la query db attuale
-
l'interfaccia del modello - Sono un grande fan delle interfacce e vedo questo modello come scambiabile per un modello NoSQL, ad esempio
-
la libreria principale - nella mia attuale libreria CI, questo 1) riceve la richiesta di funzione, 2) convalida i parametri passati ad esso, 3) richieste dal modello, 4) crea un array di risposta che include i dati & codici di errore e messaggi (configurabile in più lingue, ma in realtà non fa parte di questa domanda)
Quindi, in sintesi, il modo in cui funziona ORA si trova nel controller o nella pagina chiamante:
1) chiama la funzione di lib principale 2) modello principale di chiamate lib 3) il modello ritorna alla libreria principale 4) ritorni della lib principale al controller
ORA inizia la mia domanda sul modello di design reale:
Vorrei passare il mio oggetto conn via DI alla mia libreria principale, ma mi piacerebbe anche passare il mio modello tramite DI alla libreria principale per mantenere le cose flessibili. L'obiettivo di flessibilità che sto cercando sarebbe quello di consentire alle persone di creare i propri modelli Native DB o NoSQL & passare connessioni non PDO in questo, quindi tenerle disaccoppiate sembra ottimale.
MA per fare questo, l'unica cosa che posso pensare sarebbe come:
(controller - dove potrei effettivamente eseguire la query nella lib, non nel modello)
$conn //from the user
$model = new MyModel();
$lib = new MyLib($conn, $model);
o
$conn //from the user
$model = new MyModel($conn);
$lib = new MyLib($model);
che sembra più "naturale" dal momento che la query & conn tendono a lavorare insieme
In entrambi i casi l'utente è piuttosto maldestro e non posso fare a meno di chiedermi se non stia esagerando con questa intera cosa di DI o se abbia scelto il modello di progettazione sbagliato per farlo.
Sarebbe molto gradito qualsiasi consiglio su come impostarlo al meglio - ho passato più tempo a pensare a questo che mi ci vorrà per rifattorizzare il codice reale!
TIA