2015-11-10 13 views
5

Ho una chiamata Surface Eloquente modello che dipende da un oggetto ZipCodeRepository:Laravel5 iniezione dipendere il modello

class Surface extends Model{ 
    public function __construct(ZipCodeRepositoryInterface $zipCode){...} 

e un oggetto Indirizzo che le superfici hasMany.

class Address extends Model{ 
    public surfaces() { return $this->hasMany('App/Surface'); } 
} 

mio problema è quando chiamo $address->surfaces ricevo il seguente errore:

Argument 1 passed to App\Surface::__construct() must be an instance of App\Repositories\ZipCodeRepositoryInterface, none given 

ho pensato che il CIO potrebbe iniettare automaticamente.

+0

Guarda qui: https://stackoverflow.com/questions/22338161/cant-pass-class-instance-to-constructor/22338753 ... in particolare il problema aperto al github – svrnm

risposta

12

Grazie a @svmm per il riferimento the question mentioned in the comments. Ho scoperto che non è possibile utilizzare l'integrazione delle dipendenze su Modelli perché è necessario modificare la firma sul costruttore che non funziona con il framework Eloquent.

Quello che ho fatto come un passo intermedio, mentre refactoring del codice, è usare App::make nel costruttore per creare l'oggetto, come ad esempio:

class Surface extends Model{ 
    public function __construct() 
    { 
     $this->zipCode = App::make('App\Repositories\ZipCodeRepositoryInterface'); 
    } 

In questo modo il CIO sarà ancora afferrare il repository implementato. Lo faccio solo finché non riesco a richiamare le funzioni nel repository per rimuovere la dipendenza.

+0

Grazie! Quando si passava una dipendenza al costruttore del modello, ricevevo un errore di "troppo pochi argomenti" durante l'esecuzione di un Eloquent find (id). Questo metodo funziona molto meglio – Stetzon