Возможно ли иметь параметр маршрута в середине строки маршрута в Laravel? - PullRequest
2 голосов
/ 02 июля 2019

Как и в заголовке: возможно ли иметь параметр маршрута в середине строки в моем маршруте в Laravel 5.7?

Мой маршрут определен так:

Route::get('/foos/foo-{bar}-baz', function () {
    return 'something';
}
->where('bar', '*+'), 
->middleware(['web', MyMiddleware::class]);

Я хочу получить доступ к этому параметру в классе MyMiddleware, но он всегда возвращает значение NULL, если я не определяю свой маршрут как '/foo/{bar}/baz'

. Я пробовал несколько различных комбинаций регулярных выражений, но безрезультатно.

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Вы могли бы определить это как (хотя другие ответы, кажется, предполагают, что вам не нужно)

Route::get("/foos/{foo-bar-baz}", function($fooBarBaz){
  return "something";
});

По сути, все, что после /foos/ будет доступно как $fooBarBaz.Если $fooBarBaz содержит что-то вроде "foo-bar-baz", вы можете просто взорвать его на - и получить доступ ко второй части параметра:

$parts = explode("-", $fooBarBaz);
// do something with $parts[1]

Также должна быть возможность ограничить параметр регулярным выражением, чтобыубедитесь, что он указан в определенном формате, например foo-[a-zA-z]-baz и т. д.

0 голосов
/ 02 июля 2019

Вы можете сделать это точно так, как вы показали, я только что проверил, и он работает, как ожидалось.

Прежде всего, зарегистрируйте свое промежуточное ПО в файле app\Http\Kernel.php.

Затем в методе дескриптора промежуточного программного обеспечения вы можете получить значение bar следующим образом:

$request->route('bar');

Я использовал это для тестирования:

Route::get('/foos/foo-{bar}-baz', function($bar) {
   dd($bar);
})->middleware(['mym' => function($request, $handle) {
    dd($request->route('bar'), 'Test within middleware');
}]);

Учитывая ваше промежуточное программное обеспечениеоба снова вернули мне значение, можете попробовать добавить полное пространство имен к маршруту:

->middleware(['web', \App\Http\Middleware\MyMiddleware::class]);
0 голосов
/ 02 июля 2019

Вы должны определить регулярное выражение параметра bar:

Route::get('/foos/foo-{bar}-baz', function () {
    return 'something';
})
->where('bar', '[a-z0-9-]+')
->middleware(['web', MyMiddleware::class]);

Если после этого я зайду /foos/foo-hello-world-baz в Chrome и выполню dd($request->bar); в своем промежуточном программном обеспечении, я получу следующий вывод:

hello-world

Для получения дополнительной информации: https://laravel.com/docs/5.8/routing#parameters-regular-expression-constraints

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...