2017-05-26 85 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'。:( –