Basic classes for Specification pattern in PHP. On top of the typical set of and, or and not specificaitons, anyOf, oneOf, noneOf specifications are proposed.
This package is based on the implementation in carlosbuenosvinos/ddd.
$ composer require tanigami/specification
<?phpuseTanigami\Specification\Specification;
useTanigami\Specification\OneOfSpecification;
class Order
{
publicfunctionisPaid()
{
returntrue;
}
publicfunctionisShipped()
{
returnfalse;
}
publicfunctionisCancelled()
{
returnfalse;
}
}
class UnshippedOrderSpecification extends Specification
{
publicfunctionisSatisfiedBy($order): bool
{
return !$order->isShipped();
}
}
class PaidOrderSpecification extends Specification
{
publicfunctionisSatisfiedBy($order): bool
{
return$order->isPaid();
}
}
class CancelledOrderSpecification extends Specification
{
publicfunctionisSatisfiedBy($order): bool
{
return$order->isCancelled();
}
}
$paid = newPaidOrderSpecification;
$unshipped = newUnshippedOrderSpecification;
$cancelled = newCancelledOrderSpecification;
$paid->and($unshipped)->isSatisfiedBy(newOrder); // => true
(newOneOfSpecification($paid, $unshipped, $cancelled))->isSatisfiedBy(newOrder); // => true

