1

組み込みの laravel の Ioc コンテナーを使用して PageManager クラスを Page モデル内に挿入しようとしていますが、少し迷っています。

私が達成しようとしているのは、次のようなものです。

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

Laravel では、 IoC Containerを使用できます。

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