jcfrane / policy
一个简单直观的策略实现
v0.1.0
2018-03-28 06:14 UTC
Requires
- php: >=7.0
Requires (Dev)
- phpunit/phpunit: ^5.2
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