来自中间件终止方法中的请求的调用方法

时间:2017-05-26 09:00:17

标签: php laravel laravel-5.2

我正在使用Laravel 5.2。我有两个请求类:ApiRequestsGetUserDetailsRequest

ApiRequests有一个方法shouldLogResponse(),返回trueGetUserDetailsRequest扩展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已添加到$middlewareGroupsHttp\Kernel.php中的api。此api组已应用于我的所有API路由。

2 个答案:

答案 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,$requestGetUserDetailsRequest的实例,或者它将无法执行