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();
}
}
)
;