对于在控制器和中间件之间传递数据的最佳实践,我想提出一些意见-请记住,中间件可以在“之前”或“之后”。
过去,我对请求和合并的输入进行了更改。但是,这一次,我需要“后”中间件的解决方案。因此,我宁愿控制器运行后也不依赖请求。
我的特定情况-我的控制器返回正常的视图响应,而我的中间件将其压缩为pdf。因此,我需要将纸张配置加载到控制器以及后续的中间件中。纸张配置从模板更改为模板。
我想将纸张配置加载到控制器中,然后...以某种方式将其“返回”到隐藏在响应中的中间件。
答案 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标头会说“字母”和“风景”之类的东西。完全可以发送出去,甚至还可以发送出去。