1

我正在尝试使用内置的 laravel 的 Ioc 容器在 Page 模型中注入一个 PageManager 类,我有点迷失了。

我想要实现的是这样的:

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:传递给 Pages::__construct() 的参数 1 必须是 PagesManagerInterface 的实例,没有给出。

我试图在 app/start/global.php 中添加这个:

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

    return new Pages(new PagesManager);
});

但是似乎被框架忽略了,而且我不知道如何将 $attribute 数组插入到这个声明中。

我有点失落,所以任何帮助表示赞赏!

4

3 回答 3

7

重载模型的构造函数不是一个好主意,因为可以通过各种方法在幕后生成新实例,例如 Model::find()。

发生这种情况时,您在自定义构造函数中要求的依赖项不会被传入,因为 Model 类不知道它们。因此,您会收到该错误消息。

请参阅此处的 find() 方法:http: //laravel.com/api/source-class-Illuminate.Database.Eloquent.Model.html#380-397

请参阅 Jason Lewis 的这篇文章: http://forums.laravel.io/viewtopic.php?pid= 47124#p47124

于 2013-08-23T13:00:07.267 回答
0

我认为你需要的是:

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

    return new Pages(new PagesManager);

});

这告诉 Laravel 每次需要一个 PagesManagerInterface 实例时注入一个新的 Page 对象,而在创建模型时没有传递该实例。

于 2013-08-23T14:31:44.277 回答
0

在 Laravel 中,您可以使用IoC 容器

public function saveToDisk(){
    $managerObject = app()->make('path\to\class\PagesManagerInterface');
    $managerObject->writeToFile();
}
于 2016-12-15T08:01:18.407 回答