Iniezione delle dipendenze per le variabili di richiesta in un'applicazione web

1

Sto lavorando a un'applicazione web PHP 5.5 / MySQL.

Se una classe dipende in parte da alcune variabili GET e POST globali per i suoi membri, dovrei semplicemente fare riferimento ad esse direttamente dalla classe, o dovrei averle come argomenti nel costruttore o qualche altra funzione di avvio?

class myclass {
  protected $id;
  public function __construct() {
    $this->id = (int)$_GET['id'];
  }
}
$myclass = new myclass();

o

class myclass {
  protected $id;
  public function __construct($id) {
    $this->id = (int)$id;
  }
}
$myclass = new myclass($_GET['id']);

In che modo i quadri MVC gestiscono questo problema?

    
posta Buttle Butkus 27.04.2014 - 06:17
fonte

2 risposte

1

Un altro punto importante è il test dell'unità. Se si iniettano le dipendenze di una classe, è possibile istanziarle facilmente nei test unitari.

Potresti voler dare un'occhiata a Misko Hevery's codice pulito parla dello stato globale (ha pochi altri buoni discorsi su OOD)

    
risposta data 27.04.2014 - 10:44
fonte
0

L'intero punto di DI è quello di rendere le tue funzioni indipendenti dall'ambiente , ovvero le variabili globali . Ciò significa:

function bad () {
    $id = $_GET['id'];
    ...

È come Non valido come:

function bad () {
    global $db;
    ...

In entrambi gli esempi è necessario passare le dipendenze della funzione / metodo tramite gli argomenti della funzione. Per capirlo meglio, immagina se a un certo punto hai avuto bisogno di creare un'istanza della classe, ma quando non hai il id nella stringa della query. Un altro esempio è se in seguito hai deciso di implementare la stessa funzionalità tramite POST . Quindi devi andare e sostituire tutte quelle $_GET variabili con $_REQUEST .

Quindi, se fossi in te, sicuramente opterei per il secondo approccio. Inoltre non è affatto correlato al modello di progettazione MVC . Diversi quadri potrebbero suggerire pratiche diverse o non suggerire nulla.

    
risposta data 27.04.2014 - 07:50
fonte

Leggi altre domande sui tag