0

Behavior クラスがコールバックでオブジェクト インスタンスを使用するのに苦労しています。

class SomethingBehavior extends ModelBehavior
{
     public function setObject($obj)
     {
         // do stuff
     }

     public function afterFind(Model $model,$results,$primary)
     {
        // use the $obj reference set above
     }
}

検索操作を実行する前に、Model クラスで setObject(..) を呼び出す必要があります。理想的には、コンストラクターで必要なオブジェクトを割り当てるだけです。

class Document extends AppModel
{
    //.....
    public function __construct($id,$table,$ids)
    {
        parent::__construct($id,$table,$ds);
        $this->Something->setObject(new MyClass());
    }
}

私の問題は、動作オブジェクトがまだ構成されておらず、使用しようとするとオブジェクトではないというエラーが発生することです。

コンポーネントのようなモデルのコールバック メソッドが見つかりません。たとえば、setupまたはinitializeメソッドはありません。

必要なオブジェクトを動作に割り当てるにはどうすればよいですか?

4

2 に答える 2

2

あなたは行動をあまり扱っていないようです。コンテナ、ツリー、またはその他のコアまたはプラグインの動作を使用してみてください。そうすれば、すぐに基本を理解できます。

まず第一に、ビヘイビアはモデルにアタッチされます (そして 2.3 以降: ロードされます)。その逆ではありません。モデルの機能が「より豊富」になります。

静的に使用しているpublic $actsAsか動的に使用しているか

$this->Behaviors->attach('Something'); // since 2.3: load() instead of attach()

動作メソッドに直接アクセスできます。あなたの行動にメソッド foo() があるとしましょう。その後、モデルから次のように呼び出すことができます

$this->foo($foo, $bar);

または、コントローラーから

$this->Document->Behaviors->attach('Something')
$this->Document->foo($foo, $bar);

すごいですよね?通常、動作メソッドには次の宣言があります。

public function foo(Model $Model, $foo, $bar) {
    $alias = $Model->alias;
    // do sth
}

ご覧のとおり、モデルは常に暗黙的に渡されます (最初の引数が自動的に渡されるため)。そのすべての属性にアクセスできます。

また、モデルのコンストラクターには触れないでください。それをする必要はありません。

実行時にオブジェクトを渡す必要があるのに、なぜあなたのアプローチがうまくいかないのでしょうか?

public function setObject(MyClass $obj) {
    $this->Obj = $obj;
}

これで、ビヘイビア メソッドからオブジェクトを内部的に使用できるようになりました

public function doSth(Model $Model) {
    $this->Obj->xyz();
}

また、これは最もエレガントなアプローチではないかもしれません。

于 2013-01-31T23:35:03.993 に答える
1

somethingDocument クラスのメンバーを設定することはありません。コンストラクター内でインスタンス化するか、渡す必要があります。

個人的には、次のようにします。

class Document extends AppModel
{
    private $behavior;

    public function __construct($id,$table,$ids, ModelBehavior $behavior)
    {
        parent::__construct($id,$table,$ds);
        $this->behavior = $behavior
        $this->behavior->setObject(new MyClass());
    }
}

$doc = new Document(..., new SomethingBehavior());

または、さらに良いことに、次のようにしてさらに分離することもできます。

class Document extends AppModel
{
    private $behavior;

    public function __construct($id,$table,$ids, ModelBehavior $behavior)
    {
        parent::__construct($id,$table,$ds);
        $this->behavior = $behavior
    }
}

$behavior = new SomethingBehavior();
$behavior->setObject(new MyClass());

$doc = new Document(..., $behavior);

そうすれば、コンストラクターで行われる魔法が少なくなります。

于 2013-01-31T23:17:34.037 に答える