2016-12-18 4 views
0

Es ist irgendwie seltsam, weil ich alles gefolgt, die über das Erhalten Routenparameter in der Middleware ist online und alle von ihnen gibt NULL zurück, oder ein Fehler, dann ist das, was ich bereits versucht, und hat nicht funktioniert:Route planen Parameter in Middleware mit Ressourcen Route

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

Dieser gibt NULL zurück.

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

Und das oben genannte ergibt NULL.

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

Und diese über kehrt:

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

Was ich will, ist zu überprüfen, ob der aktuelle Benutzer ein Produkt bearbeiten möchten, ist der Besitzer dieses Produkt basiert auf zwei, was die ID von der ' ID 'Parameter der URL und der' Benutzer-ID 'in der Produktreihe in der Datenbank. und das ist mein Code:

die Middleware:

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); 
    } 
} 

und das ist mein Weg, der es ist eine Ressource Route:

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

und das ist, wie ich meine Middleware in der Kernel-Seite registriert:

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 
    ]; 
} 

Im Augenblick, basierend auf dem obigen Code, gibt es diesen Fehler zurück:

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

UPDATE: Das ist, wo ich die Middleware zu verwenden, in dem Konstruktor des Controllers:

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']]); 
    } 

Antwort

3

Der globale Middleware-Lauf vor der Strecke behoben ist.

Wenn Sie Zugriff auf Routenparameter benötigen, Middleware als Route-Middleware verwenden:

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

Jetzt hat es mich umgeleitet zurück zur Login-Seite, aber in der Login-Seite es gibt mir diese Fehlermeldung: ‚BadMethodCallException in Macroable.php Zeile 74: Methodenparameter existiert nicht. – user2682025

+0

Der obige Fehler und die Umleitung passiert, wenn ich nicht angemeldet bin, und nachdem ich die Middleware aus 'kernel.php' entfernt habe und mich eingeloggt habe, gibt es den gleichen Fehler wie im obigen Kommentar. Danke im Voraus – user2682025

Verwandte Themen