2

Мне трудно найти 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, но вышеописанная ошибка для меня, по крайней мере, пока.

+0

Маршрут() метод должен работать в промежуточном программном обеспечении Laravel 5.3 для получения параметра маршрута. Прекрасно работает для меня. – schellingerht

+0

@schellingerht Для меня метод route() 'всегда возвращается как null в Laravel 5.3. Я уже добавил промежуточное программное обеспечение в 'RouteMiddleware' в' Kernel.php' и его еще null. Я понимаю, что Laravel 5.3 изменил файл маршрута на api и web, а промежуточное программное обеспечение, которое я использую для группы api, что-то меняет? Я не понимаю, почему 'route()' в промежуточном программном обеспечении показывает null после обновления. – Neel

ответ

2

Есть два способа доступа к параметрам в промежуточном:

Метод 1 $request->route('parameter_name'); Здесь parameter_name относится к тому, что мы назвали параметр в маршруте.

Способ 2 $request->route()->parameters(); Этот метод возвращает массив всех параметров.

+0

Когда я попробовал метод 1, я получаю его как null. В методе 2 я хочу получить 'appId', поэтому, когда я добавляю его как' $ request-> route() -> parameters ('apps') ', я все еще получаю массив всех параметров, когда url имеет несколько параметров, как пример в моем OP. – Neel

+0

Для метода 1 - Убедитесь, что вы используете одноименное имя для 'parameter_name' за то, что вы назвали его в route.php. Что касается 'Route :: get ('apps/{apps}/houses/color/{color}', 'HouseController @ colourCheck'),' вы назовете его как '$ request-> route ('apps')' или '$ request-> маршрут ('цвет')'. И '$ request-> route() -> parameters();' не выполняет каких-либо параметров, он всегда возвращает массив. –

+0

Спасибо за ваш ответ @AmitGupta Я использовал метод 'route()' как '$ request-> route ('apps')', но он возвращается как 'null'. 'apps' - это имя параметра, называемое' routes/api.php'. Я также добавил промежуточное программное обеспечение в 'RouteMiddleware' в' Kernel.php', но все же его возвращает как null. – Neel

1

Resource Parameters Are Singular By Default

Если вы хотели бы сохранить прежнее поведение, а не автоматически singularizing параметры маршрута ресурса, вы можете сделать следующий вызов метода singularResourceParameters в вашем AppServiceProvider:

use Illuminate\Support\Facades\Route; 

Route::singularResourceParameters(false); 
+0

ах ... спасибо @HarryBosh за ссылку. Теперь имеет смысл, почему параметр маршрута является единственным в 5.3. – Neel

Смежные вопросы