2014-06-10 122 views
1

每当我修改一个关系(多对多)时,我想要做另一个操作。据我所知,这不能用事件监听器来完成(见https://github.com/laravel/framework/issues/2303)。这有效,Laravel:呼叫同步或附加功能

function setUserGroups($ids){ 
    $this->groups->sync($ids); 
    doSomethingElse(); 
} 

缺点是,其他开发人员不记得使用此函数是不直观的。一般来说,我可以附加行为以使用增变器来更改其他属性,将它们定义为守护或添加事件,并且我只是想能够执行与同步/附加类似的操作。

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

+1

3年半没有解决方案。迄今为止我发现的最好的方法是使用“更新”雄辩的方法,但它在数据库更新之前就被调用,对计算字段很有用,但可能不是每个人的解决方案。 – George

+1

我最终将自己的支点转换成了自己的模型 –

回答

0

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

// register listener 
Event::listen('user.groupsModified', '[email protected]'); 

事件处理程序:

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

} 

然后在setUserGroups功能触发事件:

function setUserGroups($ids){ 

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

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

这样,你可以从setUserGroups方法中抽象出依赖项,现在就是你只需要触发事件并且不需要知道处理程序的名称。

+1

问题是,开发人员仍然需要记住调用setUserGroups,而通常在修改关系时,他们可以直接调用同步而不会有任何问题。我发现一般来说,laravel对于将行为附加到雄辩的方法/修改属性是很好的(所以你不需要记得调用包装函数),这是我发现的唯一的例子,我无法绕过。 –

+1

开发人员只需要记住触发'Event-> fire('user.groupsModified')'。 –

+1

确实比调用自定义方法更好,但我仍然觉得应该有办法以某种方式来钩住它... –