DataDrivenStateMachine
Máquina de estados DATA-DRIVEN que lee configuración desde BD. A diferencia de una máquina de estados con transiciones hardcodeadas en constantes, esta clase lee estados, transiciones y gates desde las entidades: - StateDefinition: Estados disponibles - TransitionDefinition: Transiciones permitidas entre estados - GateDefinition: Gates que validan cada transición Flujo de evaluación: 1. Buscar TransitionDefinition en BD para domain + fromState + toState 2. Obtener GateDefinitions asociadas a la transición 3. Evaluar cada gate con el GateEvaluator 4. Si algún gate falla y su failureAction es 'block', denegar transición
DataDrivenStateMachine::__construct()
public function __construct(Doctrine\ORM\EntityManagerInterface $em, Milpa\Workflow\StateMachine\GateEvaluatorInterface $gateEvaluator):Parameters
| Name | Type | Description |
|---|---|---|
| $em | Doctrine\ORM\EntityManagerInterface | |
| $gateEvaluator | Milpa\Workflow\StateMachine\GateEvaluatorInterface |
DataDrivenStateMachine::canTransition()
public function canTransition(string $domain, string $fromState, string $toState, Milpa\Workflow\StateMachine\TransitionContext $context): Milpa\Workflow\StateMachine\GateResultVerifica si una transición es posible. Proceso: 1. Busca TransitionDefinition en BD 2. Si no existe, retorna deny (transición no definida) 3. Si existe, evalúa todos los gates asociados 4. Si algún gate falla y tiene failureAction = 'block', retorna deny 5. Si todos los gates pasan (o fueron exceptuados), retorna pass
Parameters
| Name | Type | Description |
|---|---|---|
| $domain | string | 'opportunity' o 'project' |
| $fromState | string | Código del estado actual |
| $toState | string | Código del estado destino |
| $context | TransitionContext | Contexto de evaluación |
Returns
Resultado de la evaluación
DataDrivenStateMachine::getAvailableTransitions()
public function getAvailableTransitions(string $domain, string $currentState, Milpa\Workflow\StateMachine\TransitionContext $context): arrayObtiene las transiciones disponibles desde un estado. Consulta BD para encontrar TransitionDefinitions con from_state = currentState y evalúa los gates de cada una para determinar si están disponibles.
Parameters
| Name | Type | Description |
|---|---|---|
| $domain | string | 'opportunity' o 'project' |
| $currentState | string | Código del estado actual |
| $context | TransitionContext | Contexto de evaluación |
Returns
Array de ['transition' => TransitionDefinition, 'result' => GateResult]
DataDrivenStateMachine::findState()
public function findState(string $domain, string $stateCode): ?Milpa\Workflow\Entities\StateDefinitionBusca un StateDefinition por domain y code.
Parameters
| Name | Type | Description |
|---|---|---|
| $domain | string | 'opportunity' o 'project' |
| $stateCode | string | Código del estado (ej: 'prospecting', 'active') |
Returns
El estado encontrado o null
DataDrivenStateMachine::transition()
public function transition(string $domain, string $fromState, string $toState, Milpa\Workflow\StateMachine\TransitionContext $context): Milpa\Workflow\Entities\StateDefinitionEjecuta una transición si es permitida. Método de conveniencia que combina canTransition() con la lógica de cambio de estado.
Parameters
| Name | Type | Description |
|---|---|---|
| $domain | string | Domain de la entidad |
| $fromState | string | Estado actual |
| $toState | string | Estado destino |
| $context | TransitionContext | Contexto de evaluación |
Returns
El nuevo estado
Throws
TransitionNotAllowedException Si la transición no es permitida
DataDrivenStateMachine::getStates()
public function getStates(string $domain): arrayObtiene todos los estados para un domain.
Parameters
| Name | Type | Description |
|---|---|---|
| $domain | string | 'opportunity' o 'project' |
Returns
Array de estados
DataDrivenStateMachine::getInitialState()
public function getInitialState(string $domain): ?Milpa\Workflow\Entities\StateDefinitionObtiene el estado inicial para un domain.
Parameters
| Name | Type | Description |
|---|---|---|
| $domain | string | 'opportunity' o 'project' |
Returns
El estado inicial o null