在控制器检索数据并将数据保存到会话以及在处理程序检索数据时出现会话存储错误 Laravel 5.5

Session store error when retrieving and saving data to the session at controller and retrieving at handler Laravel 5.5

我在Handler.php处处理异常,但是当我故意引发某个异常时,报告方法不仅会写入该异常,而且还会写入至少24次相同的Session store error,因为我正在使用会话来检索自定义错误消息。我的报告方法只有默认的parent::report($exception);。日志记录了我故意造成的查询错误,还有很多 Session store error

//render method at Handler.php 

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

        if($request->session()->has('errorOrigin'))
        {
            $errorOrigin = $request->session()->pull('errorOrigin');
        } else{
            $errorOrigin = "";
        }

        //session()->forget('errorOrigin');
        //return dd(session());
        //return parent::render($request, $exception);

        //this return is just some trying
        //return parent::render($request, $exception);
        //return dd($exception);
        //return parent::render($request, $exception);

        //just in case someone throws it but don´t has the try catch at the code
        if($exception instanceof \App\Exceptions\CustomException) {
            //$request->session()->flash('message_type', 'negative');
            \Session::flash('message_type', 'negative');
            \Session::flash('message_icon', 'hide');
            \Session::flash('message_header', 'Success');
            \Session::flash('error', '¡Ha ocurrido un error ' . $errorOrigin . "!" 
            .' Si este persiste contacte al administrador del sistema');
            return redirect()->back();

        }elseif($exception instanceof \Illuminate\Database\QueryException) {
            \Session::flash('message_type', 'negative');
            \Session::flash('message_icon', 'hide');
            \Session::flash('message_header', 'Success');
            \Session::flash('error', '¡Ha ocurrido un error en la consulta ' . $errorOrigin);//this is he customized error message
            return back();

 }else{/*Original error handling*/
            return parent::render($request, $exception);
        }
    }


//Method at my controller
public function index(Request $request)
    {


            //custom message if this methods throw an exception
            \Session::put('errorOrigin', " mostrando los clientes");

                //on purpose error, that table doesn´t exist, so it causes the QueryException error
        DB::table('shdhgjd')->get();
}

我认为检索到的所有 \SessionerrorOrigin 变量都会产生错误 Session store error,但我需要它们,是否存在 logic/syntax 错误?我需要一些帮助,因为日志越来越大,保存所有这些错误没有意义,也不只是不保存它们。

还发现这个错误发生在每个页面上,登录时的事件。我使用用户名而不是电子邮件登录(当然登录已经有效并且它使用用户名正确登录)。它有什么关系吗?我没有做任何事情就刷新了登录页面,没有尝试登录的事件,它还在我的日志中保存了一个错误,但我的应用程序继续工作。

这次我故意从不存在的数据库中引发错误 table,这是我一次引发错误时保存到日志中的错误摘要。正如您将看到的,会话存储错误或类似的重复,但有些显示未捕获 RunTimeException。还添加了最后一个的堆栈跟踪。会话存储错误至少重复 24 次甚至更多。

[2019-06-06 19:55:59] local.ERROR: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'prisma.shdhgjd' doesn't exist (SQL: select * from `shdhgjd`) 

[2019-06-06 19:56:00] local.ERROR: Session store not set on request. {"exception":"[object] (RuntimeException(code: 0): Session store not set on request. at C:\ProyectoPrisma_BS3\vendor\laravel\framework\src\Illuminate\Http\Request.php:419)
[stacktrace]
"#0" C:\ProyectoPrisma_BS3\app\Exceptions\Handler.php(69): Illuminate\Http\Request->session()

[2019-06-06 19:56:00] local.ERROR: Session store not set on request. {"exception":"[object] (RuntimeException(code: 0): Session store not set on request. at C:\ProyectoPrisma_BS3\vendor\laravel\framework\src\Illuminate\Http\Request.php:419)
[stacktrace]

[2019-06-06 19:56:00] local.ERROR: Uncaught RuntimeException: Session store not set on request. in C:\ProyectoPrisma_BS3\vendor\laravel\framework\src\Illuminate\Http\Request.php:419
Stack trace:
"#0" C:\ProyectoPrisma_BS3\app\Exceptions\Handler.php(69): Illuminate\Http\Request->session()

调用 $request->session() 引发错误,因为它 doesn't have a session object.

请求对象通过 StartSession middleware 获得会话。此中间件包含在 web 中间件组中,它会自动提供给 routes/web.php.

内的所有路由

您可能正在使用尚未建立任何会话使用的路由,例如 API 路由或您忘记了网络中间件组的路由。

并且由于错误处理程序中发生了错误,所以它变成了一个循环。 ERROR > HANDLER > ERROR > HANDLER > 等等...

通常我建议在控制器中处理所有预期的场景——包括可能的异常。这样你就不会调试错误处理程序,想知道为什么控制器会提供你可能不期望的重定向。

也就是说,在错误处理程序中处理 app-specific 异常并返回重定向或其他自定义响应是可以的,只要您针对特定异常并且不对所有异常使用重定向和会话。

您可以如何处理的示例:

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    // Create a specific path for your custom exception.
    if ($exception instanceof MyCustomException) {
        // Want to use sessions? Check if they're available.
        if ($request->hasSession()) {
            // ...
            return \redirect()->back();
        }

        // Sessions weren't available on this request. Create a different response.
        return view('errors.no-session-view');
    }

    // Use the default render response for everything else.
    return parent::render($request, $exception);
}