. */ namespace SP\Domain\Common\Services; use ReflectionAttribute; use ReflectionClass; use SP\Domain\Common\Attributes\EventReceiver as EventReceiverAttribute; /** * Trait Receiver */ trait EventReceiver { private readonly string $events; public function getEvents(): string { return $this->events; } private function setupEvents(array $userEvents = []): void { $reflectionClass = new ReflectionClass($this); $events = array_map( static function (ReflectionAttribute $attribute) { /** @var EventReceiverAttribute $instance */ $instance = $attribute->newInstance(); return $instance->eventName; }, $reflectionClass->getAttributes(EventReceiverAttribute::class) ); $this->events = $this->parseEventsToRegex(array_merge($userEvents, $events)); } /** * @param array $events * * @return string */ private function parseEventsToRegex(array $events): string { return implode('|', array_map('preg_quote', $events)); } }