Ошибка сохранения сеанса при получении и сохранении данных в сеансе на контроллере и получении в обработчике Laravel 5.5 - PullRequest
0 голосов
/ 06 июня 2019

Я обрабатываю исключения на 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();
}

Я думаю, что все эти извлеченные переменные \Session или errorOrigin создают ошибку Session store error, но они мне нужны, есть ли ошибка логики / синтаксиса?Мне нужна помощь, потому что журнал становится гигантским, и не имеет смысла сохранять все эти ошибки, а также просто не сохранять их.

Также обнаружил, что эта ошибка происходит на каждой странице, событие при входе в систему.Я вхожу с именем пользователя вместо электронной почты (конечно, логин уже работает, и он правильно входит с именем пользователя).Это как-то связано с этим?Я обновляю страницу входа, ничего не делая, не пытаясь войти в систему, и это также сохраняет ошибку в моем журнале, но мое приложение продолжает работать.

На этот раз я намеренно провоцирую ошибку из таблицы несуществующей базы данных, это сводка ошибок, которые сохраняются в журнале, когда я ЕЩЕ РАЗ провоцирую ошибку.Как вы увидите, ошибка хранилища сеанса или подобное повторяется, но некоторые показывают неперехваченный 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()

1 Ответ

0 голосов
/ 07 июня 2019

Ошибка вызывается вызовом $request->session(), потому что не имеет объекта сеанса .

Объекту запроса предоставляется сеанс через промежуточное ПО StartSession . Это промежуточное программное обеспечение входит в группу промежуточного программного обеспечения web, которое автоматически предоставляется всем маршрутам внутри routes/web.php.

Возможно, вы используете маршрут, для которого не установлено использование какого-либо сеанса, например, маршрут API или тот, где вы забыли группу веб-промежуточного программного обеспечения.

И поскольку в обработчике ошибок происходит ошибка, она становится циклом. ERROR> HANDLER> ERROR> HANDLER> и так далее ...

Обычно я рекомендую обрабатывать все ожидаемые сценарии - включая возможные исключения - в контроллере. Таким образом, вы не отлаживаете обработчик ошибок, задаваясь вопросом, почему контроллер дает перенаправление, которого вы не ожидаете.

При этом обработка особых для приложения исключений в обработчике ошибок и возврат перенаправлений или других настраиваемых ответов - это нормально, если вы нацеливаетесь на конкретные исключения и не используете перенаправления и сеансы для ВСЕХ исключений.

Пример того, как вы могли бы справиться с этим:

/**
 * 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);
}
...