Laravel:同步或附加时调用函数

Laravel:同步或附加时调用函数,laravel,laravel-4,Laravel,Laravel 4,无论何时修改关系(多对多),我都希望执行另一个操作。据我所知,这无法使用事件侦听器完成(请参阅)。这很有效 function setUserGroups($ids){ $this->groups->sync($ids); doSomethingElse(); } 缺点是,对于其他开发人员来说,记住使用这个函数是不直观的。一般来说,我可以使用变体将行为附加到其他属性的更改中,将它们定义为受保护的或添加事件,我只希望能够执行与同步/附加类似的操作 我不认为创建存储库是解决这

无论何时修改关系(多对多),我都希望执行另一个操作。据我所知,这无法使用事件侦听器完成(请参阅)。这很有效

function setUserGroups($ids){
   $this->groups->sync($ids);
   doSomethingElse();
}
缺点是,对于其他开发人员来说,记住使用这个函数是不直观的。一般来说,我可以使用变体将行为附加到其他属性的更改中,将它们定义为受保护的或添加事件,我只希望能够执行与同步/附加类似的操作


我不认为创建存储库是解决这个问题的一种方法。我们在应用程序中没有使用存储库模式,老实说,我也看到了这个问题。

您可以注册自定义事件处理程序和侦听器:

// register listener
Event::listen('user.groupsModified', 'User@onGroupsModified');
事件处理程序:

// Handle event in User class
function onGroupsModified($event)
{

}
然后在
setUserGroups
函数中触发事件:

function setUserGroups($ids){

    $this->groups->sync($ids);

    // Fire the event
    Event->fire('user.groupsModified');
}

通过这种方式,您可以从
setUserGroups
方法中提取依赖项,现在您只需要触发事件,而不需要知道处理程序的名称。

问题是开发人员仍然需要记住调用setUserGroups,而通常在修改关系时,他们可以直接调用sync,而没有任何问题。我发现,一般来说,laravel非常适合将行为附加到有说服力的方法/修改属性上(因此您不需要记住调用包装函数),这是我发现的唯一一个无法回避的示例。开发人员只需要记住激发
事件->激发('user.groupsModified'))
。的确,这比调用自定义方法要好,但我仍然觉得应该有办法在3年半的时间内实现这一点,而且没有解决方案。到目前为止,我发现最好的方法是使用“更新”雄辩的方法,但它在数据库更新之前就被调用,对计算字段很有用,但可能不是每个人的解决方案。最后,我将我的枢轴转换为自己的模型