innmind/specification
Composer 安装命令:
composer require innmind/specification
包简介
Interfaces allowing to compose a tree of specifications
关键字:
README 文档
README
Library containing interfaces allowing to compose a tree of specification. As you may want to type hint the object you to test against, the interfaces does not enforce a method isSatisfiedBy, it will be up to you to create such method.
The goal here is to have a set of interfaces so a specification can be composed easily, and decomposed afterward.
The decomposition part is useful in the case you want to translate your specification into, let's say, a doctrine query (or anything you wish).
Implementation example
use Innmind\Specification\{ Specification, Composite, Operator, Not, Comparator, Sign, }; class User { public $name; public function __construct(string $name) { $this->name = $name; } } class AndSpecification implements Composite { private $left; private $right; public function __construct(Specification $left, Specification $right) { $this->left = $left; $this->right = $right; } public function left(): Specification { return $this->left; } public function operator(): Operator { return Operator::and; } public function right(): Specification { return $this->right; } public function isSatisfiedBy(User $user): bool { return $this->left->isSatisfiedBy($user) && $this->right->isSatisfiedBy($user); } } class OrSpecification implements Composite { private $left; private $right; public function __construct(Specification $left, Specification $right) { $this->left = $left; $this->right = $right; } public function left(): Specification { return $this->left; } public function operator(): Operator { return Operator::or; } public function right(): Specification { return $this->right; } public function isSatisfiedBy(User $user): bool { return $this->left->isSatisfiedBy($user) || $this->right->isSatisfiedBy($user); } } class NotSpecification implements Not { private $specification; public function __construct(Specification $specification) { $this->specification = $specification; } public function specification(): Specification { return $this->specification; } public function isSatisfiedBy(User $user): bool { return !$this->specification->isSatisfiedBy($user); } } class NameSpecification implements Comparator { private $name; public function __construct(string $name) { $this->name = $name; } public function and(Specification $specification): Composite { return new AndSpecification($this, $specification); } public function or(Specification $specification): Composite { return new OrSpecification($this, $specification); } public function not(): Not { return new NotSpecification($this); } public function property(): string { return 'name'; } public function sign(): Sign { return Sign::equality; } public function value() { return $this->name; } public function isSatisfiedBy(User $user): bool { return $user->name === $this->name; } } $spec = (new NameSpecification('John')) ->or(new NameSpecification('Doe')) ->or((new NameSpecification('John Doe'))->not()); $spec->isSatisfiedBy(new User('John')); //true $spec->isSatisfiedBy(new User('Doe')); //true $spec->isSatisfiedBy(new User('John Doe')); //false $spec->isSatisfiedBy(new User('42')); //true
The object $spec could be easily decomposed to create the given WHERE statement of a sql query: WHERE name = "John" or name = "Doe" or name != "John Doe".
innmind/specification 适用场景与选型建议
innmind/specification 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 68.49k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2016 年 03 月 19 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「ddd」 「specification」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 innmind/specification 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 innmind/specification 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 innmind/specification 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Helper that decorates any SUS with a phpspec lazy object wrapper
Runn Me! Value Objects Library
Specification support for Doctrine
Build a domain-oriented application on Laravel Framework
Symfony bundle for broadway/broadway.
Specifications like JSON schemas and other things for mosparo
统计信息
- 总下载量: 68.49k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 15
- 依赖项目数: 12
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2016-03-19