Мне трудно найти URL-адрес маршрута в промежуточном программном обеспечении после обновления с Laravel 5.1
до Laravel 5.3
.Доступ к параметру URL-адреса маршрута в промежуточном программном обеспечении в Laravel 5.3
Вот мой маршрут файла:
Route::group(['middleware' => ['app.access']], function()
{
Route::resource('apps/{apps}/houses', 'HouseController',
['except' => ['index', 'create', 'edit']]);
Route::get('apps/{apps}/houses/colour/{colour}', '[email protected]');
...
}
Kernel.php имеет RouteMiddleware обновляется так:
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
// Added ones....
'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,
// Custom Middleware
'app.access' => \App\Http\Middleware\AppAccess::class,
];
В Laravel 5,1, и я был в состоянии получить доступ к параметру маршрута от промежуточного программного обеспечения, подобного этому, и у меня не было проблем:
public function handle($request, Closure $next)
{
$appId = $request->route('apps');
...
}
Но, так как обновление до Laravel 5,3, приведенный выше код начал вернулся $appId
в null
. Я также попытался получить доступ к параметру маршрута, например, $appId = $request->apps
, и это не сработало.
Так я тогда изменил Middleware, чтобы получить параметр URL-адрес, как это:
public function handle($request, Closure $next)
{
$appId = $request->route()->parameters('apps');
...
}
Поскольку изменения к вышесказанному, промежуточное программное обеспечение, кажется, работает для первого маршрута. Но тогда у меня возникает проблема при переходе на второй маршрут с двумя параметрами. По какой-то причине, приведенный выше код не удается и при возвращении $request->route()->parameters('apps')
из промежуточного слоя, я получаю массив так:
Array
(
[apps] => 1
[colour] => green
)
Почему это? Почему он не возвращает только $appId
, который является 1
? Я что-то упустил или это ошибка в Laravel 5.3? Я хочу, чтобы промежуточное программное обеспечение получало доступ только к параметру appId
из URL-адреса и ничего больше с маршрута. Может ли кто-нибудь помочь мне здесь, пожалуйста?
Update 1:
Я попытался изменить Middleware, чтобы получить параметр как это:
$parameters = $request->route()->parameters();
$appId = $parameters['apps'];
В выше, я получаю ошибку:
Undefined index: apps
Но когда I print_r($parameters);
, выход такой:
Array
(
[apps] => 1
[day] => tuesday
)
[]
Решение:
В конце концов, я узнал причину такого странного поведения было связано имя параметра в URL.
Следующие маршруты ресурсов генерировали параметр url маршрута как app
вместо apps
.Я не знаю почему, хотя:
Route::resource('apps/{apps}/houses', 'HouseController',
['except' => ['index', 'create', 'edit']]);
Принимая во внимание следующие маршруты генерировали параметры маршрута URL-адрес в качестве apps
:
Route::get('apps/{apps}/houses/colour/{colour}', '[email protected]');
Из-за этого странного поведения, некоторые маршруты возвращались null
для имени параметра apps
и некоторые где показаны параметры. Как только я переименовал все параметры маршрута в {app}
в routes/api.php
и Middleware, Middleware начал работать так, как должно.
Я не знаю, почему маршруты ресурсов создавали параметр как app
, но вышеописанная ошибка для меня, по крайней мере, пока.
Маршрут() метод должен работать в промежуточном программном обеспечении Laravel 5.3 для получения параметра маршрута. Прекрасно работает для меня. – schellingerht
@schellingerht Для меня метод route() 'всегда возвращается как null в Laravel 5.3. Я уже добавил промежуточное программное обеспечение в 'RouteMiddleware' в' Kernel.php' и его еще null. Я понимаю, что Laravel 5.3 изменил файл маршрута на api и web, а промежуточное программное обеспечение, которое я использую для группы api, что-то меняет? Я не понимаю, почему 'route()' в промежуточном программном обеспечении показывает null после обновления. – Neel