2015-06-13 3 views
2

Я абсолютный новичок в Laravel 5.Laravel 5 промежуточного слоя с параметрами

Я создал класс промежуточного слоя под названием BeforeMiddleware светокопию этого класса ниже.

class BeforeMiddleware { 
    public function handle($request, Closure $next, $role) 
    { 
     if($request->user()->hasRole($role)){ 
      return redirect('/pensions'); 
     } 
     return $next($request); 
    } 
} 

зарегистрирован в качестве kernel.php

protected $routeMiddleware = [ 
     'auth' => 'App\Http\Middleware\Authenticate', 
     'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth', 
     'guest' => 'App\Http\Middleware\RedirectIfAuthenticated', 
     'role' => 'App\Http\Middleware\BeforeMiddleware', 
    ]; 

модели пользователя ниже

class User extends Model { 
    public function hasRole($name) 
    { 
     return ($this->role->name == $name) ? true : false; 
    } 

    public function role() 
    { 
     return $this->belongsTo('App\Models\Role'); 
    } 
} 

и использование в routes.php ниже.

Route:get('/reporting', [ 'middleware' => 'role:Owner', 'uses' => function(){ 
    return 'secret data only be viewable by the owners'; 
}]); 

Если я открываю, что в браузере /reporting я получаю следующее сообщение об ошибке.

ReflectionException in Container.php line 776: 
Class role:Owner does not exist 

ОДНАКО если я жесткий код 'Owner' в ПО промежуточного слоя и удалите параметр $role, а также удалить его из маршрутов, которые в настоящее время выглядит следующим образом.

BeforeMiddleware.php

class BeforeMiddleware { 
    public function handle($request, Closure $next, $role) 
    { 
     if($request->user()->hasRole('Owner')){ 
      return redirect('/pensions'); 
     } 
     return $next($request); 
    } 
} 

routes.php

Route:get('/reporting', [ 'middleware' => 'role', 'uses' => function(){ 
     return 'secret data only be viewable by the owners'; 
    }]); 

работает как хотелось бы ...

поэтому мой вопрос заключается в том, чтобы передать этот параметр при использовании промежуточного ПО для управления маршрутами

Любая идея?

+0

Что делать, если вы используете 'role: owner' в определении маршрута? – Luceos

+0

привет @ Luceos не понял, что ... вы можете разработать ... Я новичок – Amjad

+0

вы используете 'role: Owner' в своем определении маршрута, что происходит, когда вы используете' role: owner', возможно, он предполагает вас хотите использовать класс, если вы пишете буквы в столицах. – Luceos

ответ

2

Если вы читали внимательно Middleware Documentation, вы заметите эту линию

параметры Middleware могут быть заданы при определении маршрута, отделяя имя промежуточного слоя и параметры с:. Несколько параметры должны быть разделены запятыми

Так что в вашем случае, если ваш класс промежуточного слоя называется BeforeMiddleware, первая часть определения промежуточного программного обеспечения должна быть before затем :, и после этого вы можете определить параметры маршрута, разделенную запятой , например:

Route:get('/reporting', [ 'middleware' => 'before:Owner', 'uses' => function(){ 
    return 'secret data only be viewable by the owners'; 
}]); 
+0

эта функция доступна на laravel 5.1 – Amjad

+1

любым способом передать ее внутри конструктор класса маршрута, когда мы используем '$ this-> middleware ('name_of_middleware')'? – activatedgeek

1

Поскольку вы используете Laravel 5.0, я предлагаю просто создать отдельные посредники для ваших ролей.

Kernel.php

'owner' => 'App\Http\Middleware\OwnerMiddleware', 

OwnerMiddleware

public function handle($request, Closure $next) 
{ 
    if($request->user()->hasRole('Owner')){ 
     return redirect('/pensions'); 
    } 
    return $next($request); 
} 

Затем в маршрутов.php

Route:get('/reporting', [ 'middleware' => 'owner', 'uses' => function(){ 
    return 'secret data only be viewable by the owners'; 
}]); 
+0

спасибо @JakeOpena, я знаю, что это сработает, но это всего лишь пример .. есть маршруты, где я бы предоставил доступ к нескольким роли ... если вы знаете, что я говорю – Amjad

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