2016-12-18 10 views
0

Это странно, потому что я следил за всем, что находится в сети, о получении параметров маршрута в промежуточном программном обеспечении, и все они возвращают NULL или ошибку. Это то, что я уже пробовал и не работал:Получить параметры маршрута в промежуточном программном обеспечении с маршрутом ресурса

public function handle($request, Closure $next) 
    { 
     $token = $request->access_token; 
     // Do something with $token 
    } 

Этот символ возвращает NULL.

public function handle($request, Closure $next) 
    { 
     $request->route('parameter_name'); 
     // Do something with $token 
    } 

И этот вышеверный возвращает NULL.

public function handle($request, Closure $next) 
    { 
     $request->route()->parameters(); 
     // Do something with $token 
    } 

И это один выше возвращений:

FatalThrowableError in CheckOwner.php line 22: Call to a member function parameters() on null

То, что я хочу, чтобы проверить, если текущий пользователь пытается изменить продукт является владельцем этого продукта на основе двух вещей идентификатор из ' id "URL-адреса и" user_id "в строке продуктов в базе данных. и вот мой код:

промежуточное:

class CheckOwner 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     //Get product from $id to edit 
     $product = Product::find($request->parameter('product')); 
     if ($product->user_id != Auth::user()->id) { 
      return redirect('home'); 
     } 
     return $next($request); 
    } 
} 

и это мой путь, который это маршрут ресурс:

//Products controller show, store, edit, update, destroy 
    Route::resource('products', 'ProductsController'); 

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

class Kernel extends HttpKernel 
{ 
    /** 
    * The application's global HTTP middleware stack. 
    * 
    * These middleware are run during every request to your application. 
    * 
    * @var array 
    */ 
    protected $middleware = [ 
     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
     \App\Http\Middleware\CheckOwner::class, 
    ]; 

    /** 
    * The application's route middleware groups. 
    * 
    * @var array 
    */ 
    protected $middlewareGroups = [ 
     'web' => [ 
      \App\Http\Middleware\EncryptCookies::class, 
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
      \Illuminate\Session\Middleware\StartSession::class, 
      \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
      \App\Http\Middleware\VerifyCsrfToken::class, 
      \Illuminate\Routing\Middleware\SubstituteBindings::class, 
     ], 

     'api' => [ 
      'throttle:60,1', 
      'bindings', 
     ], 
    ]; 

    /** 
    * The application's route middleware. 
    * 
    * These middleware may be assigned to groups or used individually. 
    * 
    * @var array 
    */ 
    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, 

     /**** OTHER MIDDLEWARE ****/ 
     'localize' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class, 
     'localizationRedirect' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class, 
     'localeSessionRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class 
     // REDIRECTION MIDDLEWARE 
    ]; 
} 

Прямо сейчас на основе кода, указанный выше, эта ошибка:

BadMethodCallException in Macroable.php line 74: Method parameter does not exist.

UPDATE: Вот где я использую промежуточный, в конструкторе контроллера:

public function __construct() 
    { 
     //Kick him/her out if he is not logged in 
     $this->middleware('auth', ['except' => ['show']]); 
     $this->middleware('checkowner', ['except' => ['create', 'store', 'show', 'update', 'delete']]); 
    } 

ответ

3

глобальный промежуточный запуск перед маршрутом будет решен.

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

protected $middlewareGroups = [ 
    'web' => [ 
     \App\Http\Middleware\CheckOwner::class, 
     // the rest of your middleware... 
    ], 
]; 
+0

Теперь он перенаправляет меня обратно на страницу входа в систему, но на странице входа в систему он дает мне эту ошибку: «BadMethodCallException в Macroable.php line 74: Параметр метода не существует. ' – user2682025

+0

Ошибка выше и перенаправление происходит, когда я не заходил в систему, а после удаления промежуточного программного обеспечения из «kernel.php» и входа в систему и добавления его обратно он дает ту же ошибку, что и комментарий выше. заранее спасибо – user2682025