【问题标题】:Using repository inside a form request on Laravel在 Laravel 的表单请求中使用存储库
【发布时间】:2017-01-19 12:20:39
【问题描述】:

所以我找到自己creating form request 来验证从表单发布的请求。有时它会变得太复杂,Laravel's Validation Rules 无能为力,所以我在数据服务中进行了另一个验证(在 Controller 中导入)。

我会举一个例子来说明清楚:

作家的帖子和文章。数据请求正在App\Http\Requests\Article\CreateArticleRequest 处理。在验证验证其有效后,请求将被转发到控制器。在控制器中,我将请求发送到 ArticleService 以获取业务逻辑。到目前为止一切顺利。

但是!如果我想自己进行一些特定的验证,而 Laravel 的验证规则无法帮助我。因为那样我就必须为复杂的查询加载一个存储库。

所以这里的大问题是我“仔细检查”请求而不是一次。所以我考虑合并我的 2 个授权(1 个来自 \Request,第二个来自我的Service)。但要实现这一点,我必须加载绑定到其接口的存储库。那么你的解决方案是什么?

【问题讨论】:

  • 不能只添加自定义验证规则吗?
  • 没有。我不能,因为我正在做复杂的查询,加载它们的唯一方法是从存储库中。只有在我加载它们之后,我才能检查用户是否有权进行该调用。
  • 你能告诉我们一些你到目前为止制作的代码吗?
  • 您可以使用复杂的自定义验证规则来使用存储库。这是正确的做法,这样表单请求就可以简单地担心授权和将输入映射到相关规则。
  • @Eitan 我的“代码故事”有点不同,我认为在这里发布代码无关紧要。

标签: php laravel validation


【解决方案1】:

extending 验证器工厂使用新规则时,您可以向其传递一个闭包,该闭包继承(参见示例 #3 here)任何所需的依赖项。

所以在你的情况下,它会是这样的:

public function boot()
{
    $repository = $this->app->make(Repository::class);
    Validator::extend('foo', function ($attribute, $value, $parameters, $validator) use ($repository) {
        return /* your validation logic */
    });
}

至于授权,您可以在您的授权方法签名中简单地键入提示必要的依赖项:

public function authorize(Repository $repository)
{
    return /* your authorization logic */
}

【讨论】:

  • 如果我想使用存储库来检查请求是否被授权/禁止呢?
猜你喜欢
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2021-02-28
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多