Как URL-адрес закодировать параметр маршрута URI в Laravel

У меня есть URI, который мне нужно передать внутри маршрута к контроллеру. Как мне справиться с этим, или, более конкретно, как я могу передать строку, которая обычно должна быть сначала закодирована URL-адресом? Может ли это быть обработано ограничением регулярного выражения в маршруте?

Строка для передачи

itm:n#_123445

Маршрут

Route::get('getChildren/{uri}', 'ChildrenController@getChildren');

3 ответа

Вы можете использовать URLфасад для этого. Полный путьIlluminate\Support\Facades\URL или просто используйте \URL так как он добавлен в config/app.php файл.

Использование:
URL::to('/getChildren', ['itm:n#_123445']));
Созданный URL:
http://domain.test/getChildren/itm%3An%23_123445
Обработка
Route::get('getChildren/{url}', function ($url) {
    dd($url); // itm:n#_123445

});

Надеюсь, это поможет тебе

Прежде всего,

Если вы используете этот конкретный формат, браузер поймет #в качестве ссылки на привязку на странице - как в этом примере: https://laravel.com/docs/7.x/packages

и не будет передавать номер в серверную часть - как вы упомянули, вам, скорее всего, придется кодировать URL-адрес перед его отправкой

Теперь, если вы уверены, что серверная часть может получать этот формат, я бы сделал preg_match в промежуточном программном обеспечении (если этот формат является повторяющимся) или непосредственно в контроллере, чтобы извлечь числовой идентификатор.

preg_match('/itm:n#_(\d*)/', $uri , $matches);
$id = matches[0]

Я бы рекомендовал обновить схему вашей таблицы, чтобы создать уникальный идентификатор для каждого uri в БД, если его еще нет. Вместо того, чтобы передавать полный uri в качестве параметра, вы должны вместо этого передать идентификатор.

Другие вопросы по тегам