Per DI, dove creare dipendenze (nuovi oggetti) specificamente all'interno del codice del framework?

2

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 è:

  1. htaccess invia tutte le richieste a index.php
  2. index.php includes() bootstrap.php
  3. 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.

    
posta James 18.08.2015 - 22:19
fonte

1 risposta

2

La maggior parte dei contenitori per le dipendenze può essere configurata per creare le dipendenze e iniettarle. Non è necessario disporre di un processo separato per creare dipendenze.

Ecco un semplice esempio che utilizza il contenitore PHP Pimple ( link )

// This is the importer service definition
$dic['arbiter_schedule_importer_games_with_slots_xml'] = function() use ($dic) {
  return new ImporterGamesWithSlotsXml(
    $dic['arbiter_db_conn']
  );
};
// This is the import command definition
$dic['arbiter_schedule_import_command'] = function() use ($dic) {
  return new ImportCommand(
    $dic['arbiter_schedule_importer_games_with_slots_xml']
  );

// This creates the command and creates/injects the importer service dependency.
$importCommand = $dic->get('arbiter_schedule_import_command');

E sì, devi creare e configurare il contenitore da qualche parte, ma dovrebbe essere sufficiente per quanto riguarda il bootstrap.

    
risposta data 18.08.2015 - 22:40
fonte