422 Unprocessable Entity с 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 HTTP-запрос на URL {{domain}}/api/menu/menu/2 и получаю в ответ следующее:

В заголовке 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

Есть идеи, какое решение?

Спасибо!


person netdjw    schedule 22.10.2020    source источник
comment
Вы автоматически создаете контроллер ресурсов. Destroye ожидает идентификатора в вашем URL-адресе. В вашем маршруте указано {menu}, что является подсказкой к идентификатору, соответствующему вашей модели меню.   -  person Flo Espen    schedule 22.10.2020
comment
Я понимаю, но как мне использовать валидатор rules() в этом случае?   -  person netdjw    schedule 22.10.2020


Ответы (1)


Как указано в вышеприведенном комментарии, вы создаете маршруты для контроллера ресурсов.

В вашем списке маршрутов вы можете видеть, что маршрут не ожидает фактического идентификатора в качестве параметра, а скорее ожидает Menu экземпляр модели, из которого Laravel автоматически получит идентификатор.

Пример, если вы отправляете форму:

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

Где $menuObject относится к типу Models\Menu. Другими словами, это экземпляр Menu модели, которую вы создали.

person lyyka    schedule 22.10.2020