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
<?php
use Tanigami\Specification\Specification;
use Tanigami\Specification\OneOfSpecification;
class Order
{
public function isPaid()
{
return true;
}
public function isShipped()
{
return false;
}
public function isCancelled()
{
return false;
}
}
class UnshippedOrderSpecification extends Specification
{
public function isSatisfiedBy($order): bool
{
return !$order->isShipped();
}
}
class PaidOrderSpecification extends Specification
{
public function isSatisfiedBy($order): bool
{
return $order->isPaid();
}
}
class CancelledOrderSpecification extends Specification
{
public function isSatisfiedBy($order): bool
{
return $order->isCancelled();
}
}
$paid = new PaidOrderSpecification;
$unshipped = new UnshippedOrderSpecification;
$cancelled = new CancelledOrderSpecification;
$paid->and($unshipped)->isSatisfiedBy(new Order); // => true
(new OneOfSpecification($paid, $unshipped, $cancelled))->isSatisfiedBy(new Order); // => true