Иногда используя доктрину, нужно посмотреть работу бизнес логики в виде последовательности запросов не углубляюсь в весь код проекта. Например необходимо разобраться с запросами которые идут к базе данных во время определённой транзакции в коде вашего приложения. Для таких целей в Doctrina предусмотрен механизм логирования, который позволяет получить на вход в методе «startQuery» строку с SQL запросом, параметры переданные SQL запросу.
Для получения нужного результата, с особенностью бизнес логики кода, достаточно отнаследоваться от класса Доктирны «\Doctrine\DBAL\Logging\EchoSQLLogger» и переопределить два метода.
Для того что бы вызвать указанный ниже класс, достаточно в коде вашего проекта добавить следующее:
1 2 3 4 5 |
$entityManager->getConnection() ->getConfiguration() ->setSQLLogger(new \Coderun\Doctrine\CustomLogger()); |
Где $entityManager это текущие объект \Doctrine\ORM\EntityManager
В результате работы логера, у вас появится файлик «logs/doctrine_log.log» с записанными данными запросов и цепочки вызовов методов в файлах с номером строки.
При желании можно исключить, не нужные цепочки файлов, добавив только те что нужно в свойство класса protected $files (указывается только название_файла.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
<?php namespace Coderun\Doctrine; /** * Class CustomLogger * Пример использования в проекте * * $entityManager->getConnection() * ->getConfiguration() * ->setSQLLogger(new \Coderun\Doctrine\CustomLogger()); * * @package Coderun\Doctrine */ class CustomLogger extends \Doctrine\DBAL\Logging\EchoSQLLogger { protected $detected = []; /** * Потенциально интересные файлы где вызываются функции Доктрины * Только название файлов или * - все файлы * @var string[] */ protected $files = [ '*', ]; protected $startTime = 0; protected $timeForeach = 0; protected $deltaForeach = []; protected $view = false; /** * В Doctrine вызывается во время начала запроса * @param string $sql * @param array|null $params * @param array|null $types */ public function startQuery($sql, array $params = null, array $types = null) { $this->view = false; // Здесь можно сделать проверку на наличие конкретных элементов в $sql и вернуть return $this->startTime = \microtime(true); $this->view = true; static $number = 1; ob_start(); $trace = debug_backtrace(); $this->timeForeach = \microtime(true); if (in_array('*',$this->files, true)) { foreach ($trace as $traceKey => $dataTrace) { echo sprintf('Номер в стеке %s',$traceKey).PHP_EOL; echo sprintf('Файл: %s:%s',$dataTrace['file'],$dataTrace['line']).PHP_EOL; echo sprintf('Класс: %s::%s',$dataTrace['class'],$dataTrace['function']).PHP_EOL; } } else { foreach ($this->files as $targetFile) { foreach ($trace as $traceKey => $dataTrace) { if (stripos($dataTrace['file'],$targetFile) === false) { continue; } echo sprintf('Номер в стеке %s',$traceKey).PHP_EOL; echo sprintf('Файл: %s:%s',$dataTrace['file'],$dataTrace['line']).PHP_EOL; echo sprintf('Класс: %s::%s',$dataTrace['class'],$dataTrace['function']).PHP_EOL; } } } $finishForeach = microtime(true); $this->deltaForeach[] = round($finishForeach - $this->timeForeach,5).' сек.'; unset($finishForeach); echo sprintf('Запрос: № %s',$number).PHP_EOL; echo $sql . PHP_EOL; if ($params) { var_export($params); } echo PHP_EOL; if ($types) { // var_dump($types); } $content = ob_get_clean(); if ($content !== false) { file_put_contents('logs/doctrine_log.log',$content,FILE_APPEND); } $number++; } /** * В Doctrine вызывается в конце запросов */ public function stopQuery() { if ($this->view) { $finish = microtime(true); $delta = $finish - $this->startTime; ob_start(); echo PHP_EOL; echo sprintf('Время: %s сек.', $delta) . PHP_EOL; echo '##################' . PHP_EOL; $content = ob_get_clean(); if ($content !== false) { file_put_contents( 'logs/doctrine_log.log', $content, FILE_APPEND ); } } } } |