我希望在PHP应用程序中实现用户状态/工作流处理。
- 基于用户的系统,任何用户都可以处于大约10种不同的状态(启用,禁用,预注册,注销,删除等)
- 定义了关于用户可以根据不同的系统事件从哪个状态进入哪个状态的规则
- 一个相当混乱(但大部分工作)的系统,充满了分散在各处的if和switch
想:
- 用一个允许定义用户转换规则的"智能"状态机替换当前的IFfy用户状态处理
- 允许可视化这些定义的规则
- 通过确保用户只能处于合法状态,使系统更加安全和防弹
:
我检查了SO和其他地方的PHP实现的工作流和状态机和有前途的候选人似乎是
- PEAR FSM http://www.indelible.org/php/FSM/guide.html
- 或eZ组件工作流http://ezcomponents.org/docs/api/trunk/introduction_Workflow.html
如果您有任何关于使用上述任何一个库的经验和/或关于我需要的适用性的意见或其他地方的提示,我将不胜感激。
取决于你的状态是如何设置的,听起来好像你可以设置一个带有工厂的类系统来优雅地处理所有这些?
你也可以用状态检查来设置你的类,你可以抛出异常,基本上使它不可能实例化类(因此不可能进入那个状态)。
我在想这样的东西可能对你有用:
class StateFactory {
$currentState;
function __construct(){
if(!isset($_SESSION['currentState'])){
$this->currentState = 'StateOne';
}
else{
$this->currentState = $_SESSION['currentState'];
}
$this->currentState = new {$this->currentState}->processState(); // I think something like this will work
}
function __deconstruct(){
$_SESSION['currentState'] = $this->currentState;
}
}
abstract class State{
abstract function processState();
}
class StateOne extends State{
function processState(){
if(<check what is needed for this state>){
<do what you need to do for this state>
return 'StateTwo';
}
else
{
return 'StateWhatever';
}
}
}
class StateTwo extends State{
function processState(){
if(<check what is needed for this state>){
<do what you need to do for this state>
return 'StateThree';
}
else
{
return 'StateWhatever';
}
}
}
class StateThree extends State{
...
}
很明显,这里缺少了很多东西,要使它成为你真正可以使用的东西需要做很多事情,但是如果你像这样把东西分开,它就不会那么混乱,你就能知道每个状态在哪里被检查,以及被检查的是什么