优雅地退出Laravel范围



我有一个作用域,它根据用户角色以限制的方式进行操作,您可以将一组规则转发到限制DB最终输出的作用域。

一个真正简化的角色限制示例:

{
"first_name": "=foo%"
}

将只返回first_namefoo%开头的记录,这实际上意味着我已禁止该角色的用户查看任何不以foo%开头的记录。

这种方法的问题是,如果有人没有限制,他会看到一切。我知道这是一个有效的假设,但如果没有限制,我想禁止一切,这样,如果创建了新角色,它就没有任何权利。

目前,我正在为这个案例抛出一个例外:

public function apply(Builder $builder, Model $model)
{
$input = $this->getAuthValues(get_class($model));
if (count($input) < 1) {
throw new Exception('No rights for you');
}
$jsonQuery = new JsonQuery($builder, $input); <-- class responsible for assembling the queries based on the input
$jsonQuery->search();
}

但这当然也不例外。在这种情况下,我希望返回空数组。

我可以使用某种方法优雅地退出作用域并返回一个空结果,而不必在之后实际执行查询吗?

由于作用域通常是链式的(流利地调用(,并且作用域不直接负责执行查询,我认为您不能"优雅地退出";因为下一个调用仍将期望Builder对象工作。

一个可能的解决方案(不简单(是创建一个扩展Builder类的类,并覆盖所有负责实际从DB获取结果的方法。我不确定您需要覆盖的所有方法,以便在所有情况下都能正常工作。您可能还想处理AbortedBuilder中的一些插入和更新情况。

class AbortedBuilder extends Builder
{
...
/**
* Run the query as a "select" statement against the connection.
*
* @return array
*/
protected function runSelect()
{
return [];
}

...
/**
* Run a pagination count query.
*
* @param  array  $columns
* @return array
*/
protected function runPaginationCountQuery($columns = ['*'])
{
return [];        
}
...
/**
* Insert a new record and get the value of the primary key.
*
* @param  array  $values
* @param  string|null  $sequence
* @return int
*/
public function insertGetId(array $values, $sequence = null)
{
throw new Exception('You are trying to insert using an aborted query!');
}
...
}

然后在你的范围内你可以做:

public function apply(Builder $builder, Model $model)
{
$input = $this->getAuthValues(get_class($model));
if (count($input) < 1) {
$builder = new AbortedBuilder();
} else {
$jsonQuery = new JsonQuery($builder, $input);
$jsonQuery->search();
}

我找到了一个解决方案来进行一个不可能的查询,该查询将返回0个结果。

public function apply(Builder $builder, Model $model)
{
$input = $this->getAuthValues(get_class($model));
if (count($input) < 1) {
$builder->whereRaw('1 = 0');
return;
}
$jsonQuery = new JsonQuery($builder, $input);
$jsonQuery->search();
}

相关内容

  • 没有找到相关文章

最新更新