2015-11-10 9 views
5

Ich habe eine Eloquent Modell namens Oberfläche, die auf einem ZipCodeRepository Objekt abhängig ist:Laravel5 Dependency Injection auf Modell

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

und ein Adressobjekt, dass hasMany Oberflächen.

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

Mein Problem ist, wenn ich $address->surfaces ich folgende Fehlermeldung erhalten, rufen:

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

Ich dachte, das IOK, dass automatisch injizieren würde.

+0

Schauen Sie hier: https://StackOverflow.com/Questions/22338161/cant-pass-Class-Instance-To-Constructor/22338753 ... vor allem die Frage bei Github geöffnet – svrnm

Antwort

12

Dank @svmm für die Referenzierung the question mentioned in the comments. Ich habe festgestellt, dass Sie die Abhängigkeitsinjektion für Modelle nicht verwenden können, da Sie die Signatur im Konstruktor ändern müssten, die nicht mit dem Eloquent-Framework funktioniert.

Was ich als Zwischenschritt tat, während Sie den Code Refactoring, ist App::make im Konstruktor, um das Objekt zu erstellen, wie zum Beispiel:

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

auf diese Weise die IoC noch das implementierte Repository greifen. Ich mache das nur, bis ich die Funktionen in das Repository ziehen kann, um die Abhängigkeit zu entfernen.

+0

Vielen Dank! Bei der Übergabe einer Abhängigkeit an den Model-Konstruktor wurde beim Ausführen einer Eloquent-Suche (ID) der Fehler "Zu wenig Argumente" angezeigt. Diese Methode funktioniert viel besser – Stetzon