【问题标题】:Validating input parameters against route bound model根据路由绑定模型验证输入参数
【发布时间】:2019-07-02 16:30:30
【问题描述】:

我有一个关于验证的小问题。 有一个 api 路由 POST /api/document/{document}/link 它接受一组文档 ID ({"ids": [1, 2, 3]}) 以链接到绑定到路由的文档。我验证这个数组如下

public function rules()
    {
        return [
            'ids' => 'required|array',
            'ids.*' => 'numeric|exists:documents,id'
        ];
    }

问题是 Document 模型有一个partner 属性,并且不可能将来自不同合作伙伴的文档链接在一起。我想要的是检查(通过他们的 ID)传递的文件是否与绑定的 Document 属于同一个合作伙伴。我想在 FormRequest 中验证这一点。有可能吗?

【问题讨论】:

  • 它只是一个 id 的数组吗?输入看起来像什么
  • 是的,输入只是一个 ID 数组。 {"ids": [1, 2, 3]}

标签: php validation laravel-5


【解决方案1】:

您可以将这些用于您的规则:

'ids' => [
    'required',
    'array'
],
'ids.*' => [
    'required',
    'exists:documents,id'

],
'ids.*.partner_id' => [
    Rule::in([$document->partner_id])
]

这将验证您的 id 是否与数组中的数字匹配,因为我们只将来自给定 $document 的路由中的 id 放入其中,它应该匹配或返回失败。

【讨论】:

  • 我无法使用'ids.*.partner_id' => [Rule::in([$document->partner_id])],因为输入数组缺少partner_id 参数。无论如何,非常感谢你告诉我正确的方向。我将发布我的最终代码作为答案。
【解决方案2】:

所以,这就是我最终的结果:

public function rules()
    {
        /** @var Document $document */
        $document = $this->route('document');

        return [
            'ids' => ['required', 'array'],
            'ids.*' => ['required', 'numeric', Rule::exists('documents','id')->where('partner_id', $document->partner_id)],
        ];
    }

事实证明,Laravel 文档https://laravel.com/docs/5.8/validation#rule-exists 中描述了这种情况。我只需要自定义执行的查询以确保传递的idpartner_id 都存在。

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 2017-01-10
    • 1970-01-01
    • 2016-05-10
    • 2014-12-03
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多