【问题标题】:How to write validation rule with resource in Laravel?如何在 Laravel 中使用资源编写验证规则?
【发布时间】:2021-02-08 11:13:50
【问题描述】:

我使用 Laravel 8 和 Resource 在我的控制器中的 api.php 和 DestroyProductRequest 中定义路由:

Route::resources([
    'product' => ProductController::class,
]);

在控制器中:

public function destroy(DestroyProductRequest $request, Product $product) {
    $product->delete();

    return Response::HTTP_OK;
}

在 DestroyProductRequest.php 中:

public function rules() {
    return [
        'id' => 'required|integer|exists:products,id',
    ];
}

现在的关键是 Route::resource 将传入的 id 从 url 转换为模型。但是现在如何在rules()函数中写出正确的规则呢?

现在它在错误响应中是 id: ["The id field is required."]

有什么想法吗?

【问题讨论】:

  • 只需在api.php中:php Route::group(['middleware' => 'auth:api'], function () { Route::resources([ 'product' => ProductController::class, ]);
  • 从浏览器我向{{domain}}/api/product/1 url 发送一个DELETE HTTP 请求
  • 好的,我明白了,但是解决办法是什么?

标签: php laravel laravel-routing laravel-validation


【解决方案1】:

默认情况下,Laravel 不验证路由参数。 您已添加自定义逻辑才能正常工作

public function rules()
{
    return [
        'product' => 'required|integer|exists:products,id',
    ];
}

protected function validationData()
{
    // Add the Route parameters to you data under validation
    return array_merge($this->all(),$this->route()->parameters());
}

在正常用例中,您不会验证路由请求。 Laravel 将返回 404 Not Found 异常。这是一个标准和适当的回应。

【讨论】:

    【解决方案2】:

    由于你使用的是资源,路由参数是隐式的biding key(产品id),所以Laravel将传入的id隐式绑定为产品。如下更改您的规则代码段,

        public function rules() {
            return [
                'product' => 'required|integer|exists:products,id',
            ];
        }
    
        public function destroy(Product $product) {
            $product->delete();
        
            return Response::HTTP_OK;
        }
    

    如果你想添加 ACL

         if ($user->can('destroy', $product)) {
                $product->delete();
            
                return Response::HTTP_OK;
            }
    

    【讨论】:

    • 我试过这种方式,回复是product: ["The product field is required."]
    • 另外,在隐式使用路由键绑定时不需要添加验证
    • 公共函数销毁(产品 $product){ $product->delete();返回响应::HTTP_OK; }
    • 又如何定义用户有或无权访问此操作?
    • 使用中间件或授权门。
    【解决方案3】:

    使用Validator 回答您的问题

    use Illuminate\Support\Facades\Validator;
    
    public function destroy(DestroyProductRequest $request, Product $product) {
        $rules = [
             'id' => 'required|integer|exists:products,id',
        ];
        $messages = [
            'id.required' => 'The id field is required.',
            'id.integer' => 'The id field need to be integer.',
            'id.exists' => 'The id field is exists.',
        ];
        Validator::make($request->all(), $rules, $messages)->validate();
        $product->delete();
        return Response::HTTP_OK;
    }
    

    在此处阅读更多信息:https://laravel.com/docs/8.x/validation

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 2017-12-01
      • 2016-11-26
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2014-04-22
      相关资源
      最近更新 更多