Requisito di base
Sto creando un framework per scopi di apprendimento (e probabile utilizzo su siti personali).
Sto usando l'iniezione di dipendenza nelle classi e sto cercando di progettare dove sarebbe un buon posto per istanziare oggetti di dipendenza.
Nota: questo è nel framework , non front-end (quindi non templates etc).
Quindi quando una classe ha una dipendenza da un'altra classe o un file di configurazione (i file di configurazione sono classi), ho bisogno di istanziare l'oggetto di dipendenza da qualche parte per poterlo passare alla nuova classe ( DI).
Sono riuscito a creare posizioni logiche per tutte le altre cose all'interno del framework, ma non riesco a capire e progettare un posto logico e utile per creare istanze di oggetti di dipendenza .
Struttura del framework
La struttura di base del mio framework è:
- htaccess invia tutte le richieste a index.php
- index.php
includes()
bootstrap.php - bootstrap.php carica tutti i componenti del framework
I "Componenti" sono cose come il Registro di Autoload SPL, che imposta la visualizzazione degli errori con ini_set()
, altre cose.
Tutti questi componenti sono in file separati e sono richiamati da bootstrap.php.
Ci sono un certo numero di componenti di sistema, ma bootstrap.php carica molto di più, molti dei quali richiedono l'inserimento di una dipendenza. Quindi questo non è un esercizio inutile per un piccolo ritorno.
Attualmente in questo modo in bootstrap.php
Attualmente sto creando un'istanza degli oggetti dipendenza in bootstrap.php prima di creare un'istanza della nuova classe di sistema. Tuttavia ritengo che questo stia rendendo bootstrap.php un po 'disordinato, ingombrante, e cose del genere dovrebbero forse vivere altrove dove (ad esempio in un livello di dipendenza e in uno spazio dei nomi di dipendenza, non in uno spazio dei nomi di bootstrap).
Esempio
Esempio di una classe di sistema con dipendenze in bootstrap.php, è una classe che gestisce se gli errori vengono visualizzati o meno:
(Caricamento automatico della classe attivo.)
bootstrap.php:
// Get the dependency from config file
$errorConfig = new errorConfig();
$dependency = $errorConfig->getErrorConfig();
// Instantiate system file, injecting config dependency from above
$displayErrors = new displayErrors();
$run = $displayErrors->runDisplayErrors($dependency);
displayErrors.php:
class displayErrors {
public function runDisplayErrors($dependency) {
ini_set('display_errors', $dependency);
}
}
Quindi $dependency
in questo caso sarà un valore dal file di configurazione di "on" o "off".
config.php:
class errorConfig {
public function getErrorConfig() {
return "on";
}
}
Quindi in bootstrap.php sto istanziando la classe che contiene la dipendenza (come una classe di configurazione), chiamando il metodo della classe di dipendenza per ottenere la dipendenza e passando l'oggetto nella classe che richiede la dipendenza.
NOTA: Il modo in cui sto effettivamente recuperando i dati di configurazione è in lavorazione, che è irrilevante qui in quanto sarà un oggetto, e sto chiedendo di dove per istanziare la classe di configurazione a ottenere l'oggetto, non come .
Farlo in questo modo significa che bootstrap.php è pieno di dipendenze, e questo non è quello che dovrebbe essere il bootstrap.php (in base alla mia opinione e alle mie idee di progettazione, potrei sbagliarmi).
bootstrap.php è un file loader che serve solo per caricare i sistemi (ad es. impostare la visualizzazione degli errori) e non per creare istanze e gestire le dipendenze.
Contenitore per l'iniezione delle dipendenze
Potrei usare un DIC (dependency injection container) (e sto leggendo i vantaggi ecc.) ma per quanto riguarda le mie attuali conoscenze di DIC, questo non risolve dove per istanziare la dipendenza oggetti.
Un DIC avrebbe solo spostato il problema, e stavo semplicemente istanziando il DIC all'interno di bootstrap.php al posto della classe di dipendenza direttamente.
Le mie domande
In termini di architettura e design delle applicazioni, dove sarebbe opportuno istanziare oggetti di dipendenza, o anche un DIC, per mantenere le cose pulite, organizzate e in ordine?
Devo aggiungere un po 'di livello che richiama bootstrap.php una volta e quindi gli oggetti di dipendenza vengono istanziati all'interno di quel livello?
Se senti istanziare gli oggetti di dipendenza all'interno di bootstrap.php è ok, per favore fammi sapere. Sarei interessato a un altro punto di vista su questo. Personalmente, sono contraria perché rende l'odore di bootstrap.php e ne diminuisce lo scopo.