. */ namespace SP\Providers\Log; use Exception; use SP\Core\Application; use SP\Core\Events\Event; use SP\Core\Events\EventReceiver; use SP\Core\Exceptions\InvalidClassException; use SP\Core\Exceptions\SPException; use SP\Core\Language; use SP\Core\LanguageInterface; use SP\DataModel\EventlogData; use SP\Domain\Security\EventlogServiceInterface; use SP\Domain\Security\Services\EventlogService; use SP\Providers\EventsTrait; use SP\Providers\Provider; use SplSubject; /** * Class LogHandler * * @package SP\Providers\Log */ final class DatabaseLogHandler extends Provider implements EventReceiver { use EventsTrait; private EventlogService $eventlogService; private Language $language; private string $events; public function __construct( Application $application, EventlogServiceInterface $eventlogService, LanguageInterface $language ) { $this->eventlogService = $eventlogService; $this->language = $language; parent::__construct($application); } /** * Receive update from subject * * @link http://php.net/manual/en/splobserver.update.php * * @param SplSubject $subject

* The SplSubject notifying the observer of an update. *

* * @return void * @throws InvalidClassException * @since 5.1.0 */ public function update(SplSubject $subject): void { $this->updateEvent('update', new Event($subject)); } /** * Evento de actualización * * @param string $eventType Nombre del evento * @param Event $event Objeto del evento * * @throws InvalidClassException */ public function updateEvent(string $eventType, Event $event): void { if (strpos($eventType, 'database.') !== false) { return; } $this->language->setAppLocales(); $eventlogData = new EventlogData(); $eventlogData->setAction($eventType); $eventlogData->setLevel('INFO'); $source = $event->getSource(); if ($source instanceof SPException) { $eventlogData->setLevel('ERROR'); $hint = $source->getHint(); if ($hint !== null) { $eventlogData->setDescription(__($source->getMessage()).PHP_EOL.$hint); } else { $eventlogData->setDescription(__($source->getMessage())); } } elseif ($source instanceof Exception) { $eventlogData->setLevel('ERROR'); $eventlogData->setDescription(__($source->getMessage())); } elseif (($eventMessage = $event->getEventMessage()) !== null) { $eventlogData->setDescription($eventMessage->composeText()); } try { $this->eventlogService->create($eventlogData); } catch (Exception $e) { processException($e); } $this->language->unsetAppLocales(); } /** * Devuelve los eventos que implementa el observador en formato cadena * * @return string */ public function getEventsString(): ?string { return $this->events; } /** * Devuelve los eventos que implementa el observador * * @return array */ public function getEvents(): array { return LogInterface::EVENTS; } public function initialize(): void { $configEvents = $this->config->getConfigData()->getLogEvents(); if (count($configEvents) === 0) { $this->events = $this->parseEventsToRegex(LogInterface::EVENTS_FIXED); } else { $this->events = $this->parseEventsToRegex(array_merge($configEvents, LogInterface::EVENTS_FIXED)); } $this->initialized = true; } }