有没有办法在分离功能之前编写我自己的验证器。
例如,我有用户和组,具有多对多关系。除非用户是该组的最后一个成员,否则无法从组中删除最后一个管理员。我不想总是在控制器中写相同的验证。
通过编写
来编写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)
答案 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函数。