jcfrane/policy

一个简单直观的策略实现

维护者

详细信息

github.com/jcfrane/policy

源代码

问题

安装: 7

依赖者: 0

建议者: 0

安全: 0

星标: 2

关注者: 2

分支: 0

开放问题: 0

类型:项目

v0.1.0 2018-03-28 06:14 UTC

This package is not auto-updated.

Last update: 2024-09-26 17:21:07 UTC


README

Policy 类的简单直观实现。

优点

  • 避免代码中的嵌套 if。
  • 将条件逻辑聚合到一个地方。

如何使用?

创建一个继承自 AbstractPolicy 的类。

use JcFrane\Policy\AbstractPolicy;

class BlogPolicy extends AbstractPolicy
{

}

在您的 Policy 类中创建表示相应策略中每个条件逻辑的方法。

use JcFrane\Policy\AbstractPolicy;

class BlogPolicy extends AbstractPolicy
{
    public function canCreate($subject)
    {
        $this->allow($subject->canCreate, 'Cannot create a subject.');
    }

    public function canView($subject)
    {
        $this->allow($subject->canView, 'Cannot view the subject.');
    }

    public function canDelete($subject)
    {
        $this->forbid($subject->canDelete, 'Cannot delete the subject.');
    }

    public function canUpdate($subject)
    {
        $this->forbid($subject->canUpdate, 'Cannot update the subject');
    }
}

评估您的 Policy 类

use JcFrane\Polcy\PolicyChecker;

use Some\Namespace\BlogPolicy;

$checker = new PolicyChecker();

$subject = new \stdClass();
$subject->canCreate = true;
$subject->canView = false;
$subject->canDelete = true;
$subject->canUpdate = false;

$result = $checker->check(BlogPolicy::class, $subject, 'create'); // returns true

$result = $checker->check(BlogPolicy::class, $subject, 'view'); // throws JcFrane/PolicyViolationException

$result = $checker->check(BlogPolicy::class, $subject, 'delete'); // returns true

$result = $checker->check(BlogPolicy::class, $subject, 'update'); // throws JcFrane/PolicyViolationException

就是这样!您现在可以在代码中创建多个聚合条件逻辑的策略类。

允许() 和禁止() 方法

allow() 接受一个布尔值和一个违规信息。如果第一个参数为真,则 check() 将返回真。否则,将抛出 ViolationException。

forbid() 接受一个布尔值和一个违规信息。如果第一个参数为假,则 check() 将抛出 ViolationException。否则,将返回真。

安装

$ composer install jcfrane/policy