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

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

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

itm:n#_123445

Маршрут

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

person Karl Hill    schedule 21.04.2020    source источник
comment
Вы пытаетесь сохранить этот uri или используете этот uri в качестве уникального идентификатора, чтобы получить некоторые другие данные для возврата пользователю?   -  person mchljams    schedule 21.04.2020
comment
@mchljams Мне не нужно это хранить. Это (itm:n#_123445) будет отправлено через AJAX на маршрут Laravel: getChildren/itm:n#_123445. Думаю, было бы лучше убрать подчеркивание и все, что было до него.   -  person Karl Hill    schedule 21.04.2020


Ответы (3)


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

Usage:
URL::to('/getChildren', ['itm:n#_123445']));
Generated url:
http://domain.test/getChildren/itm%3An%23_123445
Handling
Route::get('getChildren/{url}', function ($url) {
    dd($url); // itm:n#_123445

});

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

person Malkhazi Dartsmelidze    schedule 21.04.2020

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

person mchljams    schedule 21.04.2020

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

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

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

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

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