【问题标题】:Passing parameter from Middleware to Controller将参数从中间件传递给控制器
【发布时间】:2015-11-05 12:50:14
【问题描述】:

我有一个执行查询的中间件,我想将结果传递回我的控制器。可能吗?我正在使用 Laravel 5。

public function handle($request, Closure $next)
    {
        if ($this->auth->guest()) {
            if ($request->ajax()) {
                return view('errors.401');
            } else {
                return redirect()->guest('auth/login');
            }
        }

        $cur_route = Request::segment(1);

        $result = DB::table('t_user_acl_masters')->join('t_function_details', 't_function_details.functiondtl_id', '=' ,'t_user_acl_masters.functiondtl_id')
                                                ->where('t_function_details.routename', '=', $cur_route)
                                                ->where('t_user_acl_masters.user_id', '=', $request->user()->user_id)
                                                ->select('t_user_acl_masters.viewaccess','t_user_acl_masters.addaccess','t_user_acl_masters.editaccess','t_user_acl_masters.deleteaccess')
                                                ->first();

        if(!empty($result)) {
            if ($result->viewaccess != 'y') {
                return view('errors.401');
            }
        }

        return $next($request, $result);
    }

控制器:

public function __construct(Request $request)
    {
        parent::__construct();
        $this->middleware('auth');
        $this->user = Auth::user();
        $this->acl = $request->attributes->get('acl');
    }

public function index(Request $request){
        dd($this->acl);
}

我已将它注入到请求的属性中,但我无法从我的函数中获取它。如果我 dd($request->attributes->get('acl')) 在我的 index() 函数中,数据可用。

【问题讨论】:

  • 如何将其传回并在构造函数中显示?因为现在如果我将它设置为flash session,它只能在一个函数上获取,而不能在其他函数上获取。
  • 你到底想做什么?也许这不是应该在中间件中完成的事情。
  • 在中间件中查询出用户的访问控制。我想将它传递回我的 __construct 以便我不需要再次查询它。我的控制器中的大多数功能都需要这些数据。每个页面都需要此查询,并且查询根据查询的路线而有所不同。
  • 但如果我没看错,您只能选择viewaccess 列。基于此,您决定是否抛出401。为什么需要保存它?

标签: php laravel laravel-5 laravel-5.1


【解决方案1】:

您可以将变量存储在会话中:

Session::flash('result', $result);

然后您可以像这样在控制器中检索它:

Session::get('result');

【讨论】:

  • 当我在 __construct 中使用 Session::get('result') 时,我得到空值。但如果它在当前视图函数中,我可以得到它。
  • 那是因为构造函数是在中间件启动之前执行的。你不应该尝试将变量从中间件设置到控制器的构造函数,这是倒序的做事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多