如何用Laravel中的资源编写验证规则?

How to write validation rule with resource in Laravel?

我使用 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."]

有什么想法吗?

使用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

由于您正在使用该资源,路由参数是隐式投标键(产品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;
        }

默认情况下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 会 return 一个 404 Not Found 异常。这是一个标准和适当的回应。