Laravel Call to a member function setCookie() on null - when returning controller action from middleware

ぃ、小莉子 提交于 2021-01-27 04:57:12

问题


Hello Good Developers,

This is Not a Direct Duplicate of: Call to a member function setCookie() on null As I am calling a Controller action from Middleware and then in the controller action I am returning View,

Here's My Route from web.php

Route::get('/end', [EndPageController::class, 'index'])
->name('survey.end')
->middleware('App\Http\Middleware\LegacyEndCheck');

Middleware LegacyEndCheck.php handle function

public function handle($request, Closure $next)
{
    $sjid = $request->input('sjid', false);

    if( empty($sjid) || strlen($sjid) !== 36 ){
        return app()->make(EndLegacyController::class)->index($request); //I have to call EndLegacyController@index here as I can't change URL using redirect route
    }

    return $next($request);
}

Controller EndLegacyController index action

public function index(Request $request)
{
    $sjid = $request->input('sjid',false);
    $status = $request->input('status',false);
    if( empty($sjid) || empty($status) ){
        $this->status = 5;
        return view('survey.legacy.end')
            ->with('status', $this->status);
    }
    dd('allright');
}

So Far I've no Idea how to fix this issue as cannot return the view directly in middleware, It has to be returned through my controller because of more business logic.

Please help me to understand and resolve this issue.


Update - Stacktrace in Logs

[2019-02-15 07:59:42] local.ERROR: Call to a member function setCookie() on null {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Call to a member function setCookie() on null at D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php:180)
[stacktrace]
#0 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php(77): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->addCookieToResponse(Object(Illuminate\\Http\\Request), Object(Illuminate\\View\\View))
#1 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Support\\helpers.php(1027): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->Illuminate\\Foundation\\Http\\Middleware\\{closure}(Object(Illuminate\\View\\View))
#2 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php(79): tap(Object(Illuminate\\View\\View), Object(Closure))
#3 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#4 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#5 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\View\\Middleware\\ShareErrorsFromSession.php(49): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#6 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#7 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#8 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php(63): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#9 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#10 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#11 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse.php(37): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#12 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#13 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#14 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\EncryptCookies.php(66): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#15 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#16 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#17 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#18 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(684): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#19 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(659): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#20 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(625): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#21 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(614): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#22 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#23 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#24 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\fideloper\\proxy\\src\\TrustProxies.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#25 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#26 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#27 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#28 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#29 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#30 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#31 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#32 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#33 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php(27): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#34 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#35 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#36 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode.php(62): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#37 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#38 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#39 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#40 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#41 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#42 D:\\xampp-new-installations\\xampp-7-2-4\\htdocs\\samppoint-new-laravel\\public\\index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#43 {main}
"} 

回答1:


The Laravel lifecycle sends your request through all middleware, what you are doing is actual replacing the current response with a new view. Only responses or request should be in this flow. This is an anti pattern and it is best to do a redirect. This will make laravels lifecycle try to run its middleware on a view and trying to set a cookie on it.

If you return a view wrapped with a response, it can now add a cookie to it. But you intercept the request response lifecycle in a hacky manner.

return Response::view('survey.legacy.end', [ 'status' => $status, 'respstatus' =>  $respstatus, 'rowSurvey' => $rowSurvey ]);


来源:https://stackoverflow.com/questions/54705098/laravel-call-to-a-member-function-setcookie-on-null-when-returning-controlle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!