record: early before create/update hooks

This commit is contained in:
Yuri Kuznetsov
2024-12-21 13:58:31 +02:00
parent 65722d7143
commit f279528c56
6 changed files with 79 additions and 0 deletions
@@ -47,8 +47,10 @@ class Provider
/** @var array<string, class-string[]> */
private $typeInterfaceListMap = [
Type::BEFORE_READ => [ReadHook::class],
Type::EARLY_BEFORE_CREATE => [CreateHook::class, SaveHook::class],
Type::BEFORE_CREATE => [CreateHook::class, SaveHook::class],
Type::AFTER_CREATE => [CreateHook::class, SaveHook::class],
Type::EARLY_BEFORE_UPDATE => [UpdateHook::class, SaveHook::class],
Type::BEFORE_UPDATE => [UpdateHook::class, SaveHook::class],
Type::AFTER_UPDATE => [UpdateHook::class, SaveHook::class],
Type::BEFORE_DELETE => [DeleteHook::class],
@@ -33,6 +33,9 @@ class Type
{
public const BEFORE_READ = 'beforeRead';
public const EARLY_BEFORE_CREATE = 'earlyBeforeCreate';
public const EARLY_BEFORE_UPDATE = 'earlyBeforeUpdate';
public const BEFORE_CREATE = 'beforeCreate';
public const BEFORE_UPDATE = 'beforeUpdate';
public const BEFORE_DELETE = 'beforeDelete';
@@ -48,6 +48,24 @@ class HookManager
public function __construct(private Provider $provider)
{}
/**
* @throws BadRequest
* @throws Forbidden
* @throws Conflict
*/
public function processEarlyBeforeCreate(Entity $entity, CreateParams $params): void
{
foreach ($this->getEarlyBeforeCreateHookList($entity->getEntityType()) as $hook) {
if ($hook instanceof SaveHook) {
$hook->process($entity);
continue;
}
$hook->process($entity, $params);
}
}
/**
* @throws BadRequest
* @throws Forbidden
@@ -91,6 +109,24 @@ class HookManager
}
}
/**
* @throws BadRequest
* @throws Forbidden
* @throws Conflict
*/
public function processEarlyBeforeUpdate(Entity $entity, UpdateParams $params): void
{
foreach ($this->getEarlyBeforeUpdateHookList($entity->getEntityType()) as $hook) {
if ($hook instanceof SaveHook) {
$hook->process($entity);
continue;
}
$hook->process($entity, $params);
}
}
/**
* @throws BadRequest
* @throws Forbidden
@@ -188,6 +224,15 @@ class HookManager
return $this->provider->getList($entityType, Type::BEFORE_READ);
}
/**
* @return (CreateHook<Entity>|SaveHook<Entity>)[]
*/
private function getEarlyBeforeCreateHookList(string $entityType): array
{
/** @var (CreateHook<Entity>|SaveHook<Entity>)[] */
return $this->provider->getList($entityType, Type::EARLY_BEFORE_CREATE);
}
/**
* @return (CreateHook<Entity>|SaveHook<Entity>)[]
*/
@@ -206,6 +251,15 @@ class HookManager
return $this->provider->getList($entityType, Type::AFTER_CREATE);
}
/**
* @return (UpdateHook<Entity>|SaveHook<Entity>)[]
*/
private function getEarlyBeforeUpdateHookList(string $entityType): array
{
/** @var (UpdateHook<Entity>|SaveHook<Entity>)[] */
return $this->provider->getList($entityType, Type::EARLY_BEFORE_UPDATE);
}
/**
* @return (UpdateHook<Entity>|SaveHook<Entity>)[]
*/
+4
View File
@@ -635,6 +635,8 @@ class Service implements Crud,
$entity->set($data);
$this->populateDefaults($entity, $data);
$this->getRecordHookManager()->processEarlyBeforeCreate($entity, $params);
$this->processValidation($entity, $data);
$this->checkEntityCreateAccess($entity);
$this->processAssignmentCheck($entity);
@@ -719,6 +721,8 @@ class Service implements Crud,
$entity->set($data);
$this->getRecordHookManager()->processEarlyBeforeUpdate($entity, $params);
$this->processValidation($entity, $data);
$this->processAssignmentCheck($entity);
$this->getLinkCheck()->processFields($entity);
@@ -62,7 +62,9 @@ class Builder
['recordDefs', self::ANY_KEY, 'updateInputFilterClassNameList'],
['recordDefs', self::ANY_KEY, 'outputFilterClassNameList'],
['recordDefs', self::ANY_KEY, 'beforeReadHookClassNameList'],
['recordDefs', self::ANY_KEY, 'earlyBeforeCreateHookClassNameList'],
['recordDefs', self::ANY_KEY, 'beforeCreateHookClassNameList'],
['recordDefs', self::ANY_KEY, 'earlyBeforeUpdateHookClassNameList'],
['recordDefs', self::ANY_KEY, 'beforeUpdateHookClassNameList'],
['recordDefs', self::ANY_KEY, 'beforeDeleteHookClassNameList'],
['recordDefs', self::ANY_KEY, 'afterCreateHookClassNameList'],
+14
View File
@@ -198,6 +198,13 @@
"type": "string"
}
},
"earlyBeforeCreateHookClassNameList": {
"description": "Early-before-create hooks. Run before validation. Should implement the Espo\\Core\\Record\\Hook\\CreateHook or Espo\\Core\\Record\\Hook\\SaveHook interface. As of v9.0.",
"type": "array",
"items": {
"type": "string"
}
},
"beforeCreateHookClassNameList": {
"description": "Before-create hooks. Should implement the Espo\\Core\\Record\\Hook\\CreateHook or Espo\\Core\\Record\\Hook\\SaveHook interface.",
"type": "array",
@@ -212,6 +219,13 @@
"type": "string"
}
},
"earlyBeforeUpdateHookClassNameList": {
"description": "Early-before-update hooks. Run before validation. Should implement the Espo\\Core\\Record\\Hook\\UpdateHook or Espo\\Core\\Record\\Hook\\SaveHook interface. As of v9.0.",
"type": "array",
"items": {
"type": "string"
}
},
"beforeUpdateHookClassNameList": {
"description": "Before-update hooks. Should implement the Espo\\Core\\Record\\Hook\\UpdateHook or Espo\\Core\\Record\\Hook\\SaveHook interface.",
"type": "array",