cleverage / ruler
业务规则引擎
v0.1.0
2013-10-21 13:54 UTC
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2024-08-29 03:47:35 UTC
README
Ruler
cleverage/Ruler 是一个 PHP 5.3 库。使用它来实现自己的业务规则,并按顺序链接它们以检查是否满足预设条件。
示例
你想检查当前用户是否可以激活某个功能。为此,你必须检查:
- 他是否已连接,
- 他是否有高级订阅,
- 他的账户中是否有足够的资金。
<?php // test // PHP 5.3 $rule = new IsConnectedRule($user); $rule->andRule(new IsSuscriberRule($user, 'PREMIUM')) ->andRule(new HasMoneyRule($user, 300)) ->orRule(new IsAdminRule($user)); // PHP 5.4 $rule = (new IsConnectedRule($user)) ->andRule(new IsSuscriberRule($user, 'PREMIUM')) ->andRule(new HasMoneyRule($user, 300)) ->orRule(new IsAdminRule($user)); try { if ($rule->isSatisfied()) { echo 'activated'; } } catch (NotConnectedException $e) { // show connection form } catch (NotSuscriberException $e) { // show subscription form } catch (NotEnoughMoneyException $e) { echo 'not enough Money'; } catch(\CleverAge\Ruler\Exception\Exception $e) { echo 'Failed : '.$e->getMessage(); }
<?php // IsConnectedRule class class IsConnectedRule extends \CleverAge\Ruler\RuleAbstract { protected $_user; protected $_failure_exception_class = 'NotConnectedException'; protected $_failure_message = 'user is not connected'; public function __construct(\User $user) { $this->_user = $user; } public function doIsSatisfied() { return $this->_user->isLoggedOn(); } }
规则的组合甚至可以在单个规则类中完成,以简化应用程序代码并提高可维护性。
// ActiveFeatureXRule class class ActiveFeatureXRule extends \CleverAge\Ruler\RuleAbstract { public function __construct(\User $user) { $this->andRule(new IsSuscriberRule($user, 'PREMIUM')) ->andRule(new HasMoneyRule($user, 300)) ->orRule(new IsAdminRule($user)); } public function doIsSatisfied() { // method is abstract, and this container rule always satisfies. return true; } }
现在,您可以在需要的地方使用此规则类,只需更改构造函数即可使规则在各个地方生效。
逻辑处理方式
您设置 OR/AND/NAND 规则的顺序并不重要。最后,它们会按类型分组。
- 您希望满足规则集
// A,B,C,D,G,Z are rules $A->andRule($B) ->orRule($C->andRule($Z)) ->andRule($D) ->nandRule($G) ->isSatisfied(); // PHP =>($A && $B && $D && !$G) || ($C && $Z) // Binary => (A.B.D.!G)+(C.Z)
- 您希望不满足规则集
// A,B,C,D,G,Z are rules $A->andRule($B) ->orRule($C->andRule($Z)) ->andRule($D) ->nandRule($G) ->isNotSatisfied() // PHP => (!$A || !$B || !$D || $G) && (!$C || !$Z) // Binary => (!A+!B+!D+G).(!C+!Z)
默认情况下,isNotSatisfied() 返回 !isSatisfied()。但有时,您可能希望自定义 doIsNotSatisfied() 方法以优化工作流程(如 SQL 查询)。
自定义
设置异常类和错误消息
如果您有一个通用规则(例如:ObjectIsEqual),在组合复杂规则时,您可能需要抛出不同的异常。每个规则都有一个设置器来完成此操作。
$A = new MyRule(); $A->setException('My\Name\Space\Ruler\Exceptions\MyException', 'my custom error message'); $A->isSatisfied(); // If rule is not satisfied // it throws a new My\Name\Space\Ruler\Exceptions\MyException('my custom error message') exception