1

我想使用內置的laravel的Ioc容器在Page模型中注入一個PageManager類,我有點迷路。Laravel 4:如何在一個雄辯的模型中注入另一個類

我想要實現的是類似的東西:

class Pages extends Eloquent { 

    public function __construct(PagesManagerInterface $manager, array $attributes = array()) 
    { 
     parent::__construct($attributes); 
     $this->manager = new $manager; 
    } 

    public function saveToDisk() 
    { 
     $this->manager->writeToFile(); 
    } 

但我得到這個錯誤:

ErrorException:傳遞給頁面:: __結構變量1()必須是一個實例PagesManagerInterface,沒有給出。

我試圖在應用程序添加此/開始/ global.php:

App::bind('Pages',function(){ 

    return new Pages(new PagesManager); 
}); 

但似乎是由框架忽略的,也是我不知道如何在$屬性陣列插入此宣言。

我有點失落,所以任何幫助表示讚賞!

+0

嘗試使用'門面::互換()'方法。 – Andreyco

+0

請您詳細說明一下嗎?謝謝。 – Ingro

回答

0

我認爲你需要的是:

App::bind('PagesManagerInterface',function(){ 

    return new Pages(new PagesManager); 

}); 

這告訴Laravel以注入新的頁面對象,每次它需要一個你的PagesManagerInterface的實例,這在創建模型時沒有通過。

+0

感謝您的建議,無論如何,我結束了實例化管理器只有當需要頁面作爲參考。 – Ingro

6

重載模型的構造函數並不是一個好主意,因爲新的實例可以通過各種方法產生,如Model :: find()。

發生這種情況時,您在自定義構造函數中要求的依賴項不會被傳入,因爲Model類不知道它們。所以,你會得到那個錯誤信息。

見find()方法在這裏:http://laravel.com/api/source-class-Illuminate.Database.Eloquent.Model.html#380-397

看到這個職位由傑森·劉易斯:http://forums.laravel.io/viewtopic.php?pid=47124#p47124

+0

這是一個很好的觀點,我實際上只有在需要時纔會實例化管理器,並將頁面作爲參考傳遞。 – Ingro

0

在Laravel可以使用IOC容器

public function saveToDisk(){ 
    $managerObject = app()->make('path\to\class\PagesManagerInterface'); 
    $managerObject->writeToFile(); 
}