

Laravel 5.1 では新しく Middleware Parameters 機能が追加され、Middleware
に独自のパラメータを渡すことができるようになりましたが、PHP のバージョン要件の都合上 Laravel 5.0 を使わざるを得ない状況です。

今回 Middleware を作成し、ログインしているユーザーが指定した権限を持っているかをチェックしようと思っています。  
具体的には Auth::user()->hasRole('owner') のような形でチェックする予定なので、hasRole()
に渡すためのパラメータをどうやって middleware に伝えるべきか悩んでいます。

ひとまず Request::route()
を借りてパラメータを渡すことで一応動いてはいるのですが、正式に用意された手段ではないためどんな問題が起きるか予測できません。

middlewareの指定は各コントローラーの __construct() で行っています。

[code]

    public function __construct()
    {
        $this->middleware('auth');
        Request::route()->setParameter('allowed_roles', ['owner']);
        $this->middleware('role');
    }
    
[/code]

middleware の内容は次のとおりです。

[code]

    class CheckRole
    {
        public function handle($request, Closure $next)
        {
            $roles = $request->route()->parameter('allowed_roles', array());
    
            if(empty($roles) || $request->user()->hasRole($roles))
            {
                return $next($request);
            } else {
                return response('Unauthorized.', 401);
            }
        }
    
    }
    
[/code]

このようなケースではどのようにしてパラメータを渡すことが定番なのでしょうか？  
また、「Request::route()->setParameter()」はこういった個人的な目的のために使って良いものなのでしょうか？  
よろしくお願いします。


CC BY-SA 3.0
2015-06-17T02:52:09.927
11425
2015-06-17T05:20:14.613
2015-06-17T03:31:17.210
10083
10083
question
php laravel
Laravel 5.0でMiddlewareに独自のパラメータを渡すには？


Laravel 5.0では、Laravel
4.2のルートフィルター機能が使えます。ルートフィルターにはパラメータを指定する機能があるので、ミドルウェアの代わりに、こちらを使うのを検討されてはいかがでしょうか？

Specifying Filter Parameters

[code]

    Route::filter('age', function($route, $request, $value)
    {
        //
    });
    
    Route::get('user', array('before' => 'age:200', function()
    {
        return 'Hello World';
    }));
    
[/code]

参考URL  
<http://laravel.com/docs/4.2/routing#route-filters>  
<http://laravel.com/docs/5.0/upgrade#upgrade-5.0>

ミドルウェアはv5.0でルートフィルタに代わる物として出てきたのに、パラメータの為にルートフィルターを使うというのは、ちょっと微妙な気もしますが...

> 「Request::route()->setParameter()」はこういった個人的な目的のために使って良いものなのでしょうか？

本来の使い方ではないとは思います。この箇所のコードだけ見ると何の為にやっているのか、読み取れません。ミドルウェア内のコードを見てはじめて分かる人には分かるといった感じです。他の処理に影響が無く、コメント等で補足しておけば問題ないと判断するなら、使っても良いのではないでしょうか？これはご自身の判断になるかと思います。


CC BY-SA 3.0
2015-06-17T05:07:27.347
11430
2015-06-17T05:20:14.613
2015-06-17T05:20:14.613
10170
10170
11425
answer