Обновить

Комментарии 2

В некоторые сущности, например, в компанию \Bitrix\Crm\Service\Factory\Company не получится наследовать из-за final, что тогда делать?

Да, в некоторых стандартных сущностях, например, класс Bitrix\Crm\Service\Factory\Company имеет final. Самый простой вариант, использовать события, пока не уберут "final". Но на самом деле final можно обойти используя ReflectionAPI. Вам понадобиться:
1. Наследовать ваш класс, например CompanyFactory от абстрактного класса \Bitrix\Crm\Service\Factory
2. Использовать композицию $this->factory = Container::getInstance()->getFactory(\CCrmOwnerType::Company);, например в конструкторе
3. Переопределить публичные методы: public function isNewRoutingForDetailEnabled(): bool { $method = str_replace([__CLASS__, '::'], '', METHOD); $args = func_get_args(); return $this->factory->$method(...$args); }
4.Переопределить наследуемые и приватные методы
protected function configureAddOperation(Operation $operation): void { $method = str_replace([__CLASS__, '::'], '', METHOD); $args = func_get_args(); $reflectionMethod = new \ReflectionMethod($this->factory, $method); $reflectionMethod->setAccessible(true); // Разрешаем доступ $reflectionMethod->invoke($this->factory, ...$args); }

Так вы сможете сохранить базовую логику и при этом добавить свою. Конечно у такого подхода есть минус, при обновлении ядра нужно проверять не измениться ли базовый класс фабрики, если да, то добавить/убрать методы в своём классе.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации