cleverage/ruler

业务规则引擎

v0.1.0 2013-10-21 13:54 UTC

This package is auto-updated.

Last update: 2024-08-29 03:47:35 UTC


README

Build Status

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 规则的顺序并不重要。最后,它们会按类型分组。

  1. 您希望满足规则集
// 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)
  1. 您希望不满足规则集
// 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