我应该如何在中间件和控制器之间传递数据?

时间:2019-02-23 17:46:41

标签: laravel middleware laravel-middleware

对于在控制器和中间件之间传递数据的最佳实践,我想提出一些意见-请记住,中间件可以在“之前”或“之后”。

过去,我对请求和合并的输入进行了更改。但是,这一次,我需要“后”中间件的解决方案。因此,我宁愿控制器运行后也不依赖请求。

我的特定情况-我的控制器返回正常的视图响应,而我的中间件将其压缩为pdf。因此,我需要将纸张配置加载到控制器以及后续的中间件中。纸张配置从模板更改为模板。

我想将纸张配置加载到控制器中,然后...以某种方式将其“返回”到隐藏在响应中的中间件。

1 个答案:

答案 0 :(得分:0)

<?php
namespace FuquIo\LaravelPdfMaker;
use Illuminate\Http\Request;
use Closure;

class Middleware{

    public function handle(Request $request, Closure $next){

        /**
        * This is the only way I have found to change
        * inputs without breaking request validation.
        */
        $inputs = $request->request->all();
        $inputs['data_for_controller'] = 'foo bar';
        $request->replace($inputs);

        // run controller
        $response = $next($request);

        //...do something based on x-controller-info...
        $headers = collect($response->headers->all())->only(['x-data-from-controller']);
        //...

        return $response;
    }
}

TheController.php

public function theAction(MyValidRequest $request){
    $from_middleware = $request->data_for_controller;
    return response()         
        ->view('myBladeView', ['display_data' => $from_middleware])
        ->header('x-data-from-controller', 'insecure string for middleware');

}

将显示x标头 在这种情况下,使用x标头的东西并不多。它要去浏览器,所以它绝对不安全。在我的实际用例中,中间件正在制作pdf,因此x标头会说“字母”和“风景”之类的东西。完全可以发送出去,甚至还可以发送出去。