Skip to content
docsv0.1.0

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

Parameters of __construct()
NameTypeDescription
$emDoctrine\ORM\EntityManagerInterface
$gateEvaluatorMilpa\Workflow\StateMachine\GateEvaluatorInterface

DataDrivenStateMachine::canTransition()

public function canTransition(string $domain, string $fromState, string $toState, Milpa\Workflow\StateMachine\TransitionContext $context): Milpa\Workflow\StateMachine\GateResult

Verifica 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

Parameters of canTransition()
NameTypeDescription
$domainstring'opportunity' o 'project'
$fromStatestringCódigo del estado actual
$toStatestringCódigo del estado destino
$contextTransitionContextContexto de evaluación

Returns

Resultado de la evaluación

DataDrivenStateMachine::getAvailableTransitions()

public function getAvailableTransitions(string $domain, string $currentState, Milpa\Workflow\StateMachine\TransitionContext $context): array

Obtiene 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

Parameters of getAvailableTransitions()
NameTypeDescription
$domainstring'opportunity' o 'project'
$currentStatestringCódigo del estado actual
$contextTransitionContextContexto de evaluación

Returns

Array de ['transition' => TransitionDefinition, 'result' => GateResult]

DataDrivenStateMachine::findState()

public function findState(string $domain, string $stateCode): ?Milpa\Workflow\Entities\StateDefinition

Busca un StateDefinition por domain y code.

Parameters

Parameters of findState()
NameTypeDescription
$domainstring'opportunity' o 'project'
$stateCodestringCó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\StateDefinition

Ejecuta una transición si es permitida. Método de conveniencia que combina canTransition() con la lógica de cambio de estado.

Parameters

Parameters of transition()
NameTypeDescription
$domainstringDomain de la entidad
$fromStatestringEstado actual
$toStatestringEstado destino
$contextTransitionContextContexto de evaluación

Returns

El nuevo estado

Throws

TransitionNotAllowedException Si la transición no es permitida

DataDrivenStateMachine::getStates()

public function getStates(string $domain): array

Obtiene todos los estados para un domain.

Parameters

Parameters of getStates()
NameTypeDescription
$domainstring'opportunity' o 'project'

Returns

Array de estados

DataDrivenStateMachine::getInitialState()

public function getInitialState(string $domain): ?Milpa\Workflow\Entities\StateDefinition

Obtiene el estado inicial para un domain.

Parameters

Parameters of getInitialState()
NameTypeDescription
$domainstring'opportunity' o 'project'

Returns

El estado inicial o null