Laravel: Параметры маршрута из нескольких слов
Недавно я обновлял приложение Laravel с версии 5.5 до 8.0 (спасибо Laravel Shift!), и столкнулся с небольшой проблемой, которая недавно возникла, прежде чем я понял свою ошибку.
Рассмотрим этот маршрут:
<?php
Route::apiResource('show-participation', Api\V1\ShowParticipationController::class)->only('show');
А затем рассмотрим эту строку кода из теста:
<?php
$response = $this->getJson(route('api.v1.show-participation.show', ['show-participation' => 'abcd']));
Этот код отлично работал в Laravel 5.5, и проходил тест. Когда я обновился до Laravel 6.0, тест завершался с ошибкой:
Illuminate\Routing\Exceptions\UrlGenerationException:
Missing required parameter for [Route: api.v1.show-participation.show] [URI: api/v1/show-participation/{show_participation}] [Missing parameter: show_participation].
Мне потребовалось больше времени, чем хотелось бы, чтобы понять, что ожидаемым параметром маршрута является show_participation
и я предоставлял show_participation
в своём тесте. Это работало только до Laravel 6.0, потому что более старые версии успешно связывали параметры основанные на позиции, даже если имена не совпадали. Начиная с Laravel 6, неожиданно параметры маршрута привязываются к сгенерированной строке запроса URL.
Именно здесь полезно распознать важнейший навык замедления и внимательного чтения сообщения об ошибке. Если бы я читал внимательно, я бы избавил себя от печали.
Совет для профессионалов: Теперь, когда я получаю сообщение об ошибке, которое не сразу выделяет для меня ошибку, я в прямом смысле читаю его вслух. Это заставляет меня замедлиться на столько, чтобы понять, что дефис и подчёркивание это не одно и то же.