<?php
/**
* Created by PhpStorm.
* User: uwethiess
* Date: 22.06.17
* Time: 12:29
*/
namespace App\Service;
use App\Entity\Coupon;
use App\Entity\DBLog;
use App\Entity\Order;
use App\Entity\User;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
class DBLogService
{
/** @var EntityManager $_em */
protected $_em;
/** @var EntityRepository $_repository */
protected $_repository;
/** @var Serializer $_serializer */
protected $_serializer;
public function __construct(EntityManagerInterface $em)
{
$this->_em = $em;
$this->_repository = $this->_em->getRepository(DBLog::class);
$objectNormalizer = new ObjectNormalizer(
null,
null,
null,
null,
null,
null,
[
ObjectNormalizer::CIRCULAR_REFERENCE_HANDLER=>function ($object) {
return (string)$object;
}
]
);
// $objectNormalizer->setCircularReferenceHandler(function ($object) {
// return $object->__toString();
// });
$normalizers = [$objectNormalizer];
$encoders = [new JsonEncoder()];
$this->_serializer = new Serializer($normalizers, $encoders);
}
public function info($class, $type, $data, Order $order=null, User $user=null) {
$this->writelog('info', $class, $type, $data, $order, $user);
}
public function warning($class, $type, $data, Order $order=null, User $user=null) {
$this->writelog('warning', $class, $type, $data, $order, $user);
}
public function error($class, $type, $data, Order $order=null, User $user=null) {
$this->writelog('error', $class, $type, $data, $order, $user);
}
public function debug($class, $type, $data, Order $order=null, User $user=null) {
$this->writelog('debug', $class, $type, $data, $order, $user);
}
public function writelog($level, $class, $type, $data, Order $order=null, User $user=null) {
$log = new DBLog();
try {
$jsonData = $this->_serializer->serialize($data, 'json');
} catch (\Exception $e) {
$data = [
'level' => $level,
'class' => $class,
'type' => $type,
'exception' => $e
];
if ($user instanceof User) {
$data['user_id'] = $user->getId();
}
if ($order instanceof Order) {
$data['order_id'] = $order->getId();
}
$this->error( 'Exception', 'LoggerSerializeException', $data);
$jsonData = null;
}
if ($order) {
$order = $this->_em->merge($order);
}
$log->setTs(new \DateTime());
$log->setLevel($level);
$log->setClass($class);
$log->setType($type);
$log->setData($jsonData);
$log->setOrder($order);
$log->setUser($user);
try {
$this->_em->persist($log);
$this->_em->flush();
} catch (\Exception $e) {
$data = [
'level' => $level,
'class' => $class,
'type' => $type,
'exception' => $e
];
if ($user instanceof User) {
$data['user_id'] = $user->getId();
}
if ($order instanceof Order) {
$data['order_id'] = $order->getId();
}
$this->error( 'Exception', 'LoggingException', $data);
}
unset($log);
}
}