2017-05-26 84 views
1

我正在使用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) { //... } 

LoggingMiddlewareapi组中加入$middlewareGroupsHttp\Kernel.php。而这个api组适用于我所有的API路由。

+0

我认为你必须提供更多的细节,例如你在哪里以及如何注册和致电/注入你的课程。 –

+0

你的中间件是否被定义为单例?因为终止方法正在运行一个新的实例... –

+0

@linktoahref它是和正在按预期工作(这是我的验证逻辑)。西蒙娜卡布里诺,恐怕不是。我怎样才能做到这一点? –

回答

0

我会按照你的线索:$request不是GetUserDetailsRequest的实例。

在这个CAS中,这意味着你可能不会在控制器的方法中注入正确的对象。

尝试正确的类typehint到你的方法,像这样:

public function index(GetUserDetailsRequest $request) 
{} 

编辑: 你的编辑告诉我们,您的线索是错的,如果该方法typeHinted,$requestGetUserDetailsRequest实例或它将无法执行

+0

如果我在中间件中执行'get_class($ request)',我得到:'App \ Http \ Requests \ ApiRequests',而不是:'App \ Http \ Requests \ GetUserDetailsRequest'。 –

+0

哦,我的坏,我误解了你的帖子,你的意思是在中间件。 –

+0

那么现在,你确定通过这个URL访问的控制器方法是正确的? –

0

您的问题记录在https://github.com/laravel/framework/issues/9683页上的github问题中,并且这引起了版主在Laravel文档中添加了描述性消息。

当调用中间件的终止方法,Laravel将解决从服务容器中间件的新实例。如果您希望在调用句柄和终止方法时使用相同的中间件实例,请使用容器的单例方法向容器注册中间件。

真诚的我从来没有这样的事情,但你需要的是注册您的中间件作为。从Laravel 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); 

让我知道你是否明白如何将这两种方法调用合并在一起。

+0

的'$ request'的注册我的中间件作为你表现后,我怎样才能把它应用到中间件组*编辑:*我用命名的中间件和添加到我的路由组中,然而'exit(get_class($ request));'在terminate()中仍然表示它是'ApiRequests',而不是'GetUserDetailsRequest'。:( –