Doctrine записывает все запросы SQL в файл - PullRequest
2 голосов
/ 09 марта 2019

есть возможность логировать все запросы.Я применил его в своем коде следующим образом.

$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());

Работает, однако, выводит результаты на веб-страницы.

Мне нужно записать запросы журнала в файл.

Как я могу это реализовать?Я не нашел никакой реализации в сети.

Спасибо.

1 Ответ

1 голос
/ 09 марта 2019

Реализация очень проста, поэтому вы можете попробовать реализовать ее самостоятельно.

Для этого вам необходимо реализовать интерфейс SQLLogger. Например, это может быть реализовано как следующий класс.

<?php

namespace Infrastructure;
use Doctrine\DBAL\Logging\SQLLogger;
use InvalidArgumentException;

class SQLFileLogger implements SQLLogger
{

    private $fileName;

    public function __construct($fileName)
    {
        if (!file_exists($fileName)) {
            throw new InvalidArgumentException("File " . $fileName . " doesn't exist");
        }
        $this->fileName = $fileName;
    }


    public function startQuery($sql, array $params = null, array $types = null)
    {
        $query  = "--- QUERY : " . $sql . PHP_EOL;
        $params = "--- PARAMS : " . json_encode($params) . PHP_EOL;
        $types  = "--- TYPES : " . json_encode($types) . PHP_EOL;

        $handle = fopen($this->fileName, 'a');
        fwrite($handle, $query);
        fwrite($handle, $params);
        fwrite($handle, $types);
        fflush($handle);
        fclose($handle);
    }

    public function stopQuery()
    {
    }
}

И настроен так

$config->setSQLLogger( new \Infrastructure\SQLFileLogger( dirname( dirname( DIR ) ) . "/sql.log" ) );

Это должно записывать все запросы в файл журнала. Не стесняйтесь изменять его в соответствии с вашими потребностями.

...