Laravel - 如何将变量从中间件传递给控制器

时间:2017-01-28 14:33:02

标签: php laravel

我正在尝试将令牌从中间件传递给视图和控制器。但是我尝试过的所有步骤:

  1. Laravel - Passing variables from Middleware to controller/route
  2. Pass variable from middleware to templates
  3. Pass variable from middleware to view via controller in Laravel 5.2
  4. 没有多大帮助。这是我的设置:

    请求的形式为:

    https://website.com/reviews?linker=129b08e19014420049da7d6d7aa8fc35fc6279c4

    然后由中间件解析和检查:

    中间件

    class CheckReviewLink
    {
        /**
         * Check Review Link - granting clients access to submit review
         * =================
         * Check that user's link matches the 40 character string generated for user
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $response = $next($request);
    
            $url = $_SERVER['REQUEST_URI'];
            $parts = parse_url($url);
            $data['token'] = parse_str($parts['query'], $query);
    
            $testimonies = Testimony::all();
    
            foreach ($testimonies as $testimony) {
                if ($query['linker'] == $testimony->token)  {
                  Session::flash('token', $data);
                  return $next($request);
    
                }
            }
    
    
        }
    }
    

    **查看**

    <div class="col-lg-6">
       <article>
           <input disabled type="text" placeholder="{{Session::get('token', $data)}}" id="token" name="token" size="100" class="form-control border-form white font4light">
       </article>
     </div>
    

    当我在视图/控制器中获取会话数据时,我收到错误:

    Undefined variable: data
    

    任何想法?

4 个答案:

答案 0 :(得分:0)

当您尝试从会话中获取数据时,您不需要使用变量。所以,请改为:

{{ Session::get('token') }}

或者简单地说:

{{ session('token') }}

此外,代替flash()方法执行此操作:

session(['token' => $data]);

然后根据需要手动删除它:

session()->forget('token');

答案 1 :(得分:0)

会话闪存存储用于在应用程序的执行时间之间保留数据,即从一个页面加载传递到另一个页面加载。在您的情况下,您只想在一次运行期间将数据从应用程序的一个部分传递到另一个部分,因此内存中的变量将更清晰,更快。

这家伙已经回答了这个问题:Laravel Middleware return variable to controller

您现在可以更好,更清晰地控制代码,并且可以根据需要将数据传递给视图,而不必担心清除旧的会话数据。

答案 2 :(得分:0)

首先,您不需要handle方法中的第一行。您没有使用$response变量。

其次使用$request->url()代替$_SERVER['REQUEST_URI']

你的答案是简单地使用session('token')来获取你想要的令牌。

答案 3 :(得分:0)

如果要检索会话数据,只需调用session()辅助方法,并为其提供所需数据的密钥:

$myToken = session('token');

但是,在你的情况下,你正在为会话存储一个关联数组,所以当你调用它时,你必须这样做:

$myToken = session('token')['token'];

因此,在您看来,您将最终得到:

<div class="col-lg-6">
   <article>
       <input disabled type="text" placeholder="{{ session('token')['token'] }}" id="token" name="token" size="100" class="form-control border-form white font4light">
   </article>
 </div>