Мне трудно получить доступ к параметру URL-адреса маршрута в промежуточном программном обеспечении после обновления с Laravel 5.1
до 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}', 'HouseController@colourCheck');
...
}
В 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
, и это тоже не сработало.
Затем я изменил промежуточное ПО, чтобы получить параметр 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-адреса и ни к чему другому из маршрута. Может кто-нибудь помочь мне здесь, пожалуйста?
Обновление 1:
Я попытался изменить промежуточное ПО, чтобы получить такой параметр:
$parameters = $request->route()->parameters();
$appId = $parameters['apps'];
Выше я получаю сообщение об ошибке:
Undefined index: apps
Но когда я 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}', 'HouseController@colourCheck');
Из-за этого странного поведения некоторые маршруты возвращали null
для имени параметра apps
, а некоторые показывали параметр. После того, как я переименовал все параметры маршрута в {app}
в routes/api.php
и промежуточном программном обеспечении, промежуточное ПО начало работать так, как должно.
Я не знаю, почему маршруты ресурсов создавали параметр как app
, но приведенное выше исправило ошибку для меня, по крайней мере, на данный момент.
route()
всегда возвращается как null в Laravel 5.3. Я уже добавил промежуточное ПО вRouteMiddleware
вKernel.php
, и оно по-прежнему равно нулю. Я понимаю, что Laravel 5.3 изменил файл маршрута на api и web, а промежуточное ПО, которое я использую, предназначено для группы api, это что-то меняет? Я не понимаю, почемуroute()
в промежуточном программном обеспечении показывает null после обновления. - person Neel   schedule 25.10.2016