. */ namespace App\Twig; use App\Services\LogSystem\EventCommentType; use Jbtronics\SettingsBundle\Proxy\SettingsProxyInterface; use ReflectionClass; use Twig\TwigFunction; use App\Services\LogSystem\EventCommentNeededHelper; use Twig\Extension\AbstractExtension; final class MiscExtension extends AbstractExtension { public function __construct(private readonly EventCommentNeededHelper $eventCommentNeededHelper) { } public function getFunctions(): array { return [ new TwigFunction('event_comment_needed', $this->evenCommentNeeded(...)), new TwigFunction('settings_icon', $this->settingsIcon(...)), ]; } private function evenCommentNeeded(string|EventCommentType $operation_type): bool { if (is_string($operation_type)) { $operation_type = EventCommentType::from($operation_type); } return $this->eventCommentNeededHelper->isCommentNeeded($operation_type); } /** * Returns the value of the icon attribute of the SettingsIcon attribute of the given class. * If the class does not have a SettingsIcon attribute, then null is returned. * @param string|object $objectOrClass * @return string|null * @throws \ReflectionException */ private function settingsIcon(string|object $objectOrClass): ?string { //If the given object is a proxy, then get the real object if (is_a($objectOrClass, SettingsProxyInterface::class)) { $objectOrClass = get_parent_class($objectOrClass); } $reflection = new ReflectionClass($objectOrClass); $attribute = $reflection->getAttributes(\App\Settings\SettingsIcon::class)[0] ?? null; return $attribute?->newInstance()->icon; } }