php-extended/php-workflow-object

实现了 php-extended/php-workflow-interface 包的库

7.0.6 2024-07-31 13:28 UTC

README

实现了 php-extended/php-workflow-interface 包的库

coverage build status

安装

该库的安装通过 composer 完成,所有类的自动加载通过它们的自动加载器完成。

  • 官方网站下载 composer.phar
  • 然后运行以下命令将此库作为依赖项安装
  • php composer.phar php-extended/php-workflow-object ^7

基本用法

假设你想要表达一个门(可以打开或关闭)的工作流程。你有以下模式

+--------+    open    +--------+
|        | ---------> |        |
| closed |            | opened |
|        | <--------- |        |
+--------+   close    +--------+

然后,你需要以下类

use PhpExtended\Workflow\SubjectInterface; use PhpExtended\Workflow\StateInterface; use PhpExtended\Workflow\ConditionInterface; use PhpExtended\Workflow\WorkflowBuilder;

class Door implements SubjectInterface {

public $_state = null;

public function __construct()
{
	$this->_state = new Closed();
}

public function getState(WorkflowInterface $workflow) : StateInterface
{
	if($workflow->getName() === 'usage')
	{
		return $this->_state;
	}
	return new Closed();
}

public function execute(TransitionInterface $transition) : StateInterface
{
	if($transition->getName() === 'open')
	{
		return $this->_state = new Opened();
	}
	
	if($transition->getName() === 'close')
	{
		return $this->_state = new Closed();
	}
	
	return new Closed();
}

}

class Opened implements StateInterface; {

public function getName() : string
{
	return 'opened';
}

}

class Closed implements StateInterface {

public function getName() : string
{
	return 'closed';
}

}

class DoorIsClosed implements ConditionInterface {

public function isSatisfiedBy(SubjectInterface $subject) : bool
{
	return $subject instanceof Door
	    && $subject->getState() instanceof Closed;
}

}

class DoorIsOpened implements ICondition {

public function isSatisfiedBy(ISubject $subject) : bool
{
	return $subject instanceof Door
	       $subject->getState() instanceof Opened;
}

}

$definition = new Definition('usage'); $opened = new Opened(); $closed = new Closed(); $open = new Transition('open', $opened, $closed); $close = new Transition('close', $closed, $opened); $workflowBuilder->addCondition('open', new DoorIsClosed()); $workflowBuilder->addTransition('close', $opened, $closed); $workflowBuilder->addCondition('close', new DoorIsOpened());

$workflow = $workflowBuilder->getWorkflow('usage');

$door = new Door(); // 在实例化时,门是关闭的 $workflow->can($door, $closed); // 返回 false $workflow->car($door, $opened); // 返回 true $workflow->perform($door, $opened); // 门现在是打开的 $workflow->can($door, $opened); // 返回 false $workflow->can($door, $closed); // 返回 true $workflow->perform($door, $closed); // 门现在是关闭的

许可证

MIT (见 许可证文件).