如何监听关系添加事件?

时间:2017-04-20 12:06:46

标签: octobercms

我想在后端添加相关模型时调用函数。 这可以通过使用数据透视模型来实现,但在这种情况下必须有一些数据透视数据,否则不会触发数据透视模型事件。

我不需要任何数据透视数据,只是为了监听关系添加事件。

3 个答案:

答案 0 :(得分:1)

我认为此问题已解决,请参见此pull request和API Docs。他们为多对多关系添加了4个事件:afterAttach, afterDetach, beforeAttach and beforeDetach

答案 1 :(得分:0)

你问的问题很复杂,也不容易实现。

如果查看关系管理器行为的函数onRelationManageCreate,您可以看到它不会触发任何事件。

我建议你扩展行为,用你自己的方法覆盖onRelationManageCreate()方法,并使用你自己的行为而不是关系管理器行为。

public MyRelationController extends RelationController 
{

    public function afterRelationCreate()
    {
    }

    public function onRelationManageCreate() 
    {
       parent::onRelationManageCreate();
       $this->afterRelationCreate();
    }

}

当然,这对于链接记录,选择下拉列表,关系表单,复选框列表都没有作用。

如果你真的希望抓住它,你需要听取创建的模型的onCreate方法。

答案 2 :(得分:0)

我猜这只适用于“belongsTo”关系

我认为在那里添加了关系,但它没有直接保存到数据库中,因为它将首先存储在不同的表中,因此我们可以拦截它。

https://github.com/octobercms/october/blob/master/modules/backend/behaviors/RelationController.php#L1043

https://github.com/octobercms/library/blob/762bb0a048d103db4d659d3749a02ea4877ba48f/src/Database/Traits/DeferredBinding.php#L36

所以如果你可以在“DeferredBinding”模型表上监听事件,你就可以实现你想要的目标。

与DeferredBinding表一样,它包含所有相关信息:

 Schema::create('deferred_bindings', function(Blueprint $table)
    {
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->string('master_type')->index();
        $table->string('master_field')->index();
        $table->string('slave_type')->index();
        $table->string('slave_id')->index();
        $table->string('session_key');
        $table->boolean('is_bind')->default(true);
        $table->timestamps();
    });

你可以看到你可以在那里获得大量信息。

use October\Rain\Database\Models\DeferredBinding as DeferredBindingModel;

然后使用这个模型:

DeferredBindingModel::saved(function($model) {

    // you can check relations etc if your parent model is foo
    // then you can check for which model this data is sotred
    // $model->master_type it will be you model's full name space
    // you can compare it 

    if($model->master_type == 'foo') {
        // your interception code here
    }
}

请告知我们是否有帮助:)。