我正在使用Laravel 5.2。我有两个请求类:ApiRequests
和GetUserDetailsRequest
。
ApiRequests
有一个方法shouldLogResponse()
,返回true
。 GetUserDetailsRequest
扩展ApiRequests
并覆盖shouldLogResponse()
以返回false
。
我还有一个LoggingMiddleware
课程,在terminate()
方法中有以下内容:
$response_content = 'Response is not logged';
if ($request->shouldLogResponse()) {
$response_content = $response->getContent();
}
ApiLogger::request($request->getPathInfo(), $request->getContent(), $response_content);
然而它不起作用,因为$request
不是GetUserDetailsRequest
类的实例(我推测)。如何在中间件中获取特定请求的请求类?
编辑:控制器中使用了GetUserDetailsRequest
。
public function getUser(GetUserDetailsRequest $request) { //... }
LoggingMiddleware
已添加到$middlewareGroups
组Http\Kernel.php
中的api
。此api
组已应用于我的所有API路由。
答案 0 :(得分:2)
您的问题记录在页面https://github.com/laravel/framework/issues/9683的github问题中,这使得版主在Laravel文档中添加了描述性消息。
在中间件上调用terminate方法时, Laravel将从服务容器中解析新的中间件实例。如果您想在调用handle和terminate方法时使用相同的中间件实例,请使用容器的singleton方法向容器注册中间件。
真诚的我从未做过这样的事情,但你需要的是将你的中间件注册为 singleton 。从Laravel service container documentation我明白,这可以通过这样的方式完成
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton('HelpSpot\API', function ($app) {
return new HelpSpot\API($app->make('HttpClient'));
});
}
}
但是,为了在运行时注册中间件,你必须做这样的事情
$this->app['router']->middleware('middleware_name', App\Middleware\Name::class);
如果您了解如何将这两种方法合并在一起,请告诉我。
答案 1 :(得分:0)
我将按照您的提示:$request
不是GetUserDetailsRequest
的实例。
在那个cas中,这意味着你可能不会在控制器的方法中注入正确的对象。
尝试为您的方法键入正确的类,如下所示:
public function index(GetUserDetailsRequest $request)
{}
编辑:
您的编辑向我们显示您的线索是错误的,如果方法是typeHinted,$request
是GetUserDetailsRequest
的实例,或者它将无法执行