Laravel: Параметры маршрута из нескольких слов

Источник: «Multi-word Route Parameters in 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.

Именно здесь полезно распознать важнейший навык замедления и внимательного чтения сообщения об ошибке. Если бы я читал внимательно, я бы избавил себя от печали.

Совет для профессионалов: Теперь, когда я получаю сообщение об ошибке, которое не сразу выделяет для меня ошибку, я в прямом смысле читаю его вслух. Это заставляет меня замедлиться на столько, чтобы понять, что дефис и подчёркивание это не одно и то же.

Дополнительные материалы

Предыдущая Статья

Laravel Pint — средство исправления стиля кода

Следующая Статья

TypeScript: Типы данных, аннотация и синонимы