Как 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 в качестве параметра, вы должны вместо этого передать идентификатор.