Ошибка DateTime не может быть преобразована в строку в AppServiceProvider при входе в систему - PullRequest
0 голосов
/ 14 января 2020

В laravel 6 app В app / Providers / AppServiceProvider. php Я поместил свой инструмент отладки, который работал нормально в моих laravel 5 приложениях, но в некоторых случаях laravel 6 I (например, авторизация при входе в систему). ) Я получил ошибку:

[2020-01-14 12:58:42] local.ERROR: Object of class DateTime could not be converted to string {"userId":8,"exception":"[object] (ErrorException(code: 0): Object of class DateTime could not be converted to string at /mnt/_work_sdb8/wwwroot/lar/hostels3-backend-api/app/Providers/AppServiceProvider.php:144)
[stacktrace]

В приложении / Http / Controllers / AuthController. php:

public function login(Request $request)
{
    $request->validate([
        'email'       => 'required|string|email',
        'password'    => 'required|string',
        'remember_me' => 'boolean'
    ]);
    $credentials = request(['email', 'password']);

    if ( ! Auth::attempt($credentials)) {
        return response()->json(['message' => 'Unauthorized'], 401);
    }

    $user = $request->user();
    \Log::info('-10 LOGIN $user::');
    \Log::info(print_r($user, true)); // CHECK THAT USER IS LOGGED

    $tokenResult = $user->createToken('Access Token'); // THIS LINE RAISE ERROR => in AppServiceProvider.php would be 1 more error ref

и в приложении / Providers / AppServiceProvider. php:

public function boot()
{
    Resource::withoutWrapping();

    if ($this->app->environment('local')) {


        \Event::listen(
            [
                TransactionBeginning::class,
            ],
            function ($event) {
                //return; // to comment

                $str   = "  BEGIN; ";
                $dbLog = new \Monolog\Logger('Query');
                if (isDeveloperComp()) {
                    $dbLog->pushHandler(new \Monolog\Handler\RotatingFileHandler(storage_path('logs/Query.txt'), 5, \Monolog\Logger::DEBUG));
                    $dbLog->info($str);
                    $dbLog->info('');
                    $dbLog->info('');
                }
                writeSqlToLog($str, '', true);
                writeSqlToLog("");
                writeSqlToLog("");
            });


        \Event::listen(
            [
                TransactionCommitted::class,
            ],
            function ($event) {
                //return; // to comment

                $str   = "  COMMIT; ";
                $dbLog = new \Monolog\Logger('Query');
                if (isDeveloperComp()) {
                    $dbLog->pushHandler(new \Monolog\Handler\RotatingFileHandler(storage_path('logs/Query.txt'), 5, \Monolog\Logger::DEBUG));
                    $dbLog->info($str);
                    $dbLog->info('');
                    $dbLog->info('');
                }
                writeSqlToLog($str, '', true);
                writeSqlToLog("");
                writeSqlToLog("");
            });


        \Event::listen(
            [
                TransactionRolledBack::class,
            ],
            function ($event) {
                //return; // to comment
                //
                $str   = "  ROLLBACK; ";
                $dbLog = new \Monolog\Logger('Query');
                if (isDeveloperComp()) {
                    $dbLog->pushHandler(new \Monolog\Handler\RotatingFileHandler(storage_path('logs/Query.txt'), 5, \Monolog\Logger::DEBUG));
                    $dbLog->info($str);
                    $dbLog->info('');
                    $dbLog->info('');
                }
                writeSqlToLog($str, '', true);
                writeSqlToLog("");
                writeSqlToLog("");
            });


        \DB::listen(function ($query) {
            // return; // to comment

            $dbLog = new \Monolog\Logger('Query');
            if (isDeveloperComp()) {
                $dbLog->pushHandler(new \Monolog\Handler\RotatingFileHandler(storage_path('logs/Query.txt'), 5, \Monolog\Logger::DEBUG));
            }
            $str = $query->sql;
            $str = str_replace('%', 'QWERTYQWERTY', $str);
            $str = str_replace('?', "%s", $str);
            if (count($query->bindings) == 1) {
                $str = sprintf($str, "'" . $query->bindings[0] . "'");
            }
            if (count($query->bindings) == 2) {
                $str = sprintf($str, "'" . $query->bindings[0] . "'", "'" . $query->bindings[1] . "'");
            }
            ...
            if (count($query->bindings) == 8) {
                $str = sprintf($str, "'" . $query->bindings[0] . "'", "'" . $query->bindings[1] . "'", "'" . $query->bindings[2] . "'", "'" . $query->bindings[3] . "'",
                    "'" . $query->bindings[4] . "'", "'" . $query->bindings[5] . "'", "'" . $query->bindings[6] . "'", "'" . $query->bindings[7] . "'"); 
                // THIS LINE RAISE ERROR TOO !!!
            }

            if (count($query->bindings) == 9) {
                $str = sprintf($str, "'" . $query->bindings[0] . "'", "'" . $query->bindings[1] . "'", "'" . $query->bindings[2] . "'", "'" . $query->bindings[3] . "'",
                    "'" . $query->bindings[4] . "'", "'" . $query->bindings[5] . "'", "'" . $query->bindings[6] . "'", "'" . $query->bindings[7] . "'",
                    "'" . $query->bindings[8] . "'");
            }

Я не устанавливаю какой-либо параметр даты и могу сказать, что это некоторая функциональность asutomati c auth.

Почему ошибка и как ее можно исправить?

Спасибо !

1 Ответ

1 голос
/ 06 февраля 2020

На самом деле, да. Это функциональность auth.
Поэтому вместо использования $query->bindings вам нужно создать собственный массив привязок, чтобы предотвратить ошибку преобразования объекта в строку, такую ​​как:

$bindings = [];
foreach ($query->bindings as $binding) {
    if ($binding instanceof \DateTime) {
        $bindings[] = $binding->format('Y-m-d H:i:s');
        continue;
    }
    $bindings[] = $binding;
}

Теперь используйте $bindings в вашем \DB::listen(function($query) {})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...