422使用Laravel 8删除路由的不可处理实体

时间:2020-10-22 17:05:29

标签: php laravel laravel-8

我有一个使用以下代码的常见Larvel 8项目:

routes / api.php 文件中:

Route::resources([
    'menu/menu' => Menu\MenuController::class,
]);

app / Http / Controllers / Menu / MenuController.php 文件中:

public function destroy(DestroyMenuRequest $request, Menu $menu) {
    $menu->delete();

    return Response::HTTP_OK;
}

DestroyMenuRequest.php 文件中:

class DestroyMenuRequest extends FormRequest {
    public function authorize() {
        return $this->user()->can('destroy.menu');
    }

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

然后,我向网址DELETE发送一个{{domain}}/api/menu/menu/2 HTTP请求,并得到以下信息:

在标头422(不可处理的条目)中和正文中:

{
    "message": "The given data was invalid.",
    "errors": {
        "id": [
            "The id field is required."
        ]
    }
}

如果我使用php artisan r:l列出路由,则会看到使用正确控制器的路由:

DELETE | api/menu/menu/{menu} | menu.destroy | App\Http\Controllers\Menu\MenuController@destroy | api auth:api

有什么解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

正如我上面的评论所指出的,您正在为资源控制器生成路由。

在您的路线列表中,您可以看到该路线不希望使用实际ID作为参数,而是希望使用Menu模型实例,Laravel会自动从中获取ID。

如果要提交表单的示例:

<form method="POST" action="{{ route('menu.destroy', ['menu' => $menuObject]) }}">
@method("DELETE")
...
</form>

$menuObject的类型为Models\Menu。换句话说,它是您创建的Menu模型的一个实例