Laravel:我在哪里可以写我的beforeDetach

时间:2014-09-16 09:58:15

标签: laravel laravel-4

有没有办法在分离功能之前编写我自己的验证器。

例如,我有用户和组,具有多对多关系。除非用户是该组的最后一个成员,否则无法从组中删除最后一个管理员。我不想总是在控制器中写相同的验证。

通过编写

来编写beforeSave和afterSave是非常简单的
public function save()
{
   // Before save 
   parent::save();
   // After save
}

但是目前我还没有处理我之前应该写的东西。

我像这样调用分离方法

$group->users()->detach($user_id);

我希望在后台始终被动地检查是否符合某些条件。

目前我还没有找到解决方案。如果本地不可能如何实施呢?

修改

如果我能拥有这样的方法,那就认为它会更酷:

$group->users()->detach($user_id);
$group->users()->validateAndDetach($user_id)

1 个答案:

答案 0 :(得分:1)

这是一个有效的解决方案,虽然不是最漂亮的。任何提高这一点的指示都是值得欢迎的。

首先,我扩展了BelongsToMany类:

class BelongsToManyGroupUser extends  Illuminate\Database\Eloquent\Relations\BelongsToMany
{
    public function detach($ids = array(), $touch = true)
    {
        // Before detach
        parent::detach();
        // After detach
    }
}

然后我在我的群组模型中创建了一个新方法:

public function belongsToManyGroupUser($related, $table = null, $foreignKey = null, $otherKey = null)
{
    $caller = $this->getBelongsToManyCaller();
    $foreignKey = $foreignKey ?: $this->getForeignKey();
    $instance = new $related;
    $otherKey = $otherKey ?: $instance->getForeignKey();
    if (is_null($table))
    {
        $table = $this->joiningTable($related);
    }
    $query = $instance->newQuery();
    return new BelongsToManyGroupUser($query, $this, $table, $foreignKey, $otherKey);
}

我几乎复制了这个函数的基础,只是返回了我的新BelongsToManyGroupUser对象。

我建立了这样的关系

public function users()
{
    return $this->belongsToManyGroupUser('User', 'group_user');
}

我不喜欢这个解决方案的事实是我从BelongsToMany类中复制了10行代码。如果要改变那些我必须手动进行更改。 我也改变了:

return new BelongsToMany($query, $this, $table, $foreignKey, $otherKey, $caller['function']);`

要:

return new BelongsToManyGroupUser($query, $this, $table, $foreignKey, $otherKey, $caller);

注意最后一个参数。前者给了我错误,因为$ caller已经是构造函数所期望的String,我只是将$ caller作为最后一个参数传递。我还不确定效果。

修改

现在我可以在BelongsToManyGroupUser类中编写自己的validateAndDetach函数。