Action
Описание класса
В данный момент уже есть пять видов операций. При этом у каждого типа сущности есть свои особенности при выполнении операций.
Чтобы иерархия классов не разрасталась, было принято решение вынести дополнительные действия в отдельную иерархию классов, чтобы каждый тип сущности мог управлять ими при запуске операций.
Класс Bitrix\Crm\Service\Operation\Action
является абстрактным с единственным методом:
abstract public function process(Item $item): Result;
В этом методе могут быть произведены какие-то проверки, и если произошла ошибка, то её необходимо добавить в результат выполнения метода.
Здесь же можно изменить состояние объекта $item, если это действие до сохранения.
Если действие после сохранения, можно вызвать $item->save()
ещё раз.
Добавление действия производится через метод Service\Operation::addAction()
.
При добавлении действий не обязательно делать полноценного наследника, достаточно воспользоваться анонимным классом.
В настоящее время есть следующие реализации дополнительных действий:
Action\CheckRestrictions
- проверка ограничений.Action\ClearCache
- сброс кеша.Action\MoveToBin
- перенос в корзину.Action\SendEventCompatible
- отправка и обработка событий. У этого класса есть ещё наследники для разных типов событий.
Примеры
use Bitrix\Crm\Service; $entityTypeId = 128; $factory = Service\Container::getInstance()->getFactory($entityTypeId); $item = $factory->getItem(100); $operation = $factory->getUpdateOperation($item); $operation ->addAction( Operation ::ACTION_BEFORE_SAVE, new class extends Operation \Action { public function process(Item $item): Result { $result = new Result(); if ($item->getId() > 100) { $result->addError (new Error('id is too big!' )); } return $result; } } ) ->addAction( Operation ::ACTION_AFTER_SAVE, new class extends Operation \Action { public function process(Item $item): Result { // send notification, log changes etc. return new Result(); } } ) ;