2015-11-10 36 views
5

Tôi có một hùng biện Mẫu gọi là bề mặt mà phụ thuộc vào một đối tượng ZipCodeRepository:dependency injection Laravel5 trên Model

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

và một đối tượng Địa chỉ rằng bề mặt hasMany.

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

Vấn đề của tôi là khi tôi gọi $address->surfaces tôi nhận được lỗi sau:

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

Tôi nghĩ IoC sẽ tự động tiêm đó.

+0

Xem tại đây: https://stackoverflow.com/questions/22338161/cant-pass-class-instance-to-constructor/22338753 ... đặc biệt là sự cố được mở tại github – svrnm

Trả lời

12

Nhờ @svmm để tham chiếu the question mentioned in the comments. Tôi thấy rằng bạn không thể sử dụng tiêm phụ thuộc vào Mô hình vì bạn sẽ phải thay đổi chữ ký trên hàm tạo không hoạt động với khung công tác Eloquent.

Những gì tôi đã làm như một bước trung gian, trong khi refactoring mã, là sử dụng App::make trong constructor để tạo ra các đối tượng, chẳng hạn như:

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

Bằng cách đó các IoC vẫn sẽ lấy các kho thực hiện. Tôi chỉ làm điều này cho đến khi tôi có thể kéo các chức năng vào kho lưu trữ để loại bỏ sự phụ thuộc.

+0

Cảm ơn bạn! Khi đi qua một phụ thuộc vào constructor Model, tôi đã nhận được một lỗi "quá ít đối số" khi thực hiện tìm kiếm Eloquent (id). Phương pháp này hoạt động tốt hơn nhiều – Stetzon

Các vấn đề liên quan