/Spec

Simple specification pattern implementation

Primary LanguagePHPMIT LicenseMIT

Spec

Build Status

Spec is a PHP implementation of the Specification pattern which can be used for building simple or complex business rules.

In computer programming, the specification pattern is a particular software design pattern, whereby business rules can be recombined by chaining the business rules together using boolean logic. The pattern is frequently used in the context of domain-driven design.

https://en.wikipedia.org/wiki/Specification_pattern

The library uses the incredible expression-language component from Symfony to provide the DSL for expressions.

Installation

$ composer require danfekete/spec

Usage

1. Simple expression

$d = [2];
$spec = new Specification(new ExpressionSpec('1 > d[0]'));
$spec->isSatisfiedBy(['d' => $d]); // return false

2. Boolean chaining

/*
 * You can use classes in expression code
*/
class Nan {

    public function isNan($value)
    {
        return is_nan($value);
    }

}

$spec = new Specification(new AndSpec(
    new NotSpec(new ExpressionSpec('checker.isNan(d)')),
    new OrSpec(
        new ExpressionSpec('d != 12'),
        new ExpressionSpec('d > 10')
    ),
    new AndSpec(
        new ExpressionSpec('d > 5'),
        new ExpressionSpec('d < 20')
    )
));

$spec->isSatisfiedBy(['d' => 17, 'checker' => new Nan()]); // return true

TODO

  1. Cache parsed code permanently
  2. Array builder, builds specification from arrays
  3. JSON builder

License

MIT, see LICENSE