Как определить маршрут Laravel с параметром, который содержит символ косой черты
Я хочу определить маршрут с параметром, который будет содержать символ slash /
, такой как example.com/view/abc/02
, где abc/02
- это параметр.
Как я могу запретить Laravel читать косую черту в качестве разделителя для следующего параметра маршрута? Из-за этого я получаю 404 not found error
сейчас.
Ответы
Ответ 1
Добавьте ниже всего маршрута catch-all в конец вашего routes.php
и не забудьте запустить composer dump-autoload
после этого. Обратите внимание на использование "- > где", которое указывает возможное содержимое параметров, позволяющее использовать параметр, содержащий косую черту.
//routes.php
Route::get('view/{slashData?}', '[email protected]')
->where('slashData', '(.*)');
А чем в вашем контроллере вы просто обрабатываете данные, как обычно, (например, он не содержал косую черту).
//controller
class ExampleController extends BaseController {
public function getData($slashData = null)
{
if($slashData)
{
//do stuff
}
}
}
Это должно сработать для вас.
Кроме того, здесь у вас есть подробные документы Laravel о параметрах маршрута: [docs]
Ответ 2
urlencoded slashes не работают в Laravel из-за того, что я считаю ошибкой.
https://github.com/laravel/framework/pull/4323
Этот запрос на растяжение разрешит эту ошибку.
Update.
Обратите внимание, что это изменение позволяет анализировать маршрут перед расшифровкой значений в пути.
Ответ 3
У меня есть аналогичная проблема, но мой URL-адрес содержит несколько параметров маршрута:
/test/{param1WithSlash}/{param2}/{param3}
И вот как я справился в этом случае:
Route::get('test/{param1WithSlash}/{param2}/{param3}', function ($param1MayContainsSlash, $param2, $param3) {
$content = "PATH: " . Request::path() . "</br>";
$content .= "PARAM1: $param1WithSlash </br>";
$content .= "PARAM2: $param2 </br>".PHP_EOL;
$content .= "PARAM3: $param3 </br>".PHP_EOL;
return Response::make($content);
})->where('param1MayContainsSlash', '(.*(?:%2F:)?.*)');
Надеюсь, это поможет.