record: early before create/update hooks
This commit is contained in:
@@ -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>)[]
|
||||
*/
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user