StartSession中间件抛出ErrorException

时间:2016-08-12 08:36:48

标签: php laravel symfony laravel-5.2 middleware

使用Laravel 5.2。

导航到路线时出现以下错误。

Argument 1 passed to Illuminate\Session\Middleware\StartSession::addCookieToResponse() must be an instance of Symfony\Component\HttpFoundation\Response, null given, called in /Users/.../vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php on line 72 and defined

我不明白的是,如果请求是通过POST发出的,则不会抛出ErrorException并收到预期的响应。

我已将App\Exceptions\Handler::handler($request, Exception $e)方法修改为以下内容;

public function render($request, Exception $e) {

    // If request is being made via AJAX or wants a JSON response.
    if ($request->ajax() || $request->wantsJson()) {

        // Check to see if 'getStatusCode()' method exists, otherwise use 500.
        $status_code = method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500;

        // Send JSON response.
         return json($e->getMessage(), $status_code);

    }

    return parent::render($request, $e);

}

json()助手定义为:

function json($message, $status = 200, $data = null) {

    $output = [
        'success' => is_between($status, [200, 299]),
        'statusCode' => $status,
        'timestamp' => time(),
        'message' => $message,
    ];

    if(!is_null($data))
        $output['data'] = $data;

    return \Illuminate\Support\Facades\Response::json($output, $status);

}

is_between();

function is_between($value, array $range) {

    if($value > $range[1])
        return false;

    if($value < $range[0])
        return false;

    return true;

}

我已经尝试恢复App\Exceptions\Handler::handler($request, Exception $e)方法,看看是否有任何问题导致问题,但我仍然遇到同样的问题。

我也尝试过重写路由和控制器,使用相同的最终结果,如果通过POST请求进行操作,否则会抛出ErrorException

1 个答案:

答案 0 :(得分:1)

不知何故,框架没有将返回的字符串转换为响应对象。 Illuminate \ Session \ Middleware \ StartSession类中的addCookieToResponse方法希望将Response对象作为第一个参数。确保在所有路线中都返回一个。

这是一个可能的快速修复方法,根据您的情况进行更改。

在:

Route::get('hi', function() {
    return 'hi';
});

后:

Route::get('hi', function() {
    return response('hi');
});