nicoswd / symfony-rule-engine-bundle
Symfony Rule Engine Bundle - Parses & Evaluates Rules Written in a JavaScript-like Syntax
Installs: 764
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 2
Forks: 0
Open Issues: 0
Type:bundle
Requires
- nicoswd/php-rule-parser: ^0.5.6
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^5.4.0|^6.0
README
This package bundles nicoSWD/php-rule-parser
Requires PHP >= 7.0
Compatible with Symfony 3 and 4!
Install
$ composer require nicoswd/symfony-rule-engine-bundle
<?php // in AppKernel::registerBundles() $bundles = [ // ... new nicoSWD\RuleBundle\RuleBundle(), // ... ];
Usage Example
<?php $rule = '[1, 4, 3].join(glue) === "1-4-3"'; $variables = ['glue' => '-']; $result = $this->get('rule_parser')->isTrue($rule, $variables); var_dump($result); // bool(true)
Custom Functions
Custom functions are automatically discovered. They just need to be configured
as service with the tag nico_swd.rule.function
.
If you have multiple functions inside the same directory, the easiest way to make them visible to the bundle is this:
services.yml
AppBundle\Functions\: resource: '../../src/AppBundle/Functions' tags: ['nico_swd.rule.function']
Furthermore, custom functions must implement nicoSWD\Rules\Core\CallableUserFunction
like in the example below
<?php namespace AppBundle\Functions; use nicoSWD\Rules\Core\CallableUserFunction; use nicoSWD\Rules\Tokens\BaseToken; use nicoSWD\Rules\Tokens\TokenArray; class ArrayFilter implements CallableUserFunction { /** * @param BaseToken $param * @param BaseToken $param ... * @return BaseToken */ public function call($param = null) { // Make sure this functions only works on arrays if (!$param instanceof TokenArray) { throw new \InvalidArgumentException(); } return new TokenArray( array_values( array_filter( $param->toArray() ) ) ); } public function getName(): string { return 'array_filter'; } }
The functions optionally retrieve instances of nicoSWD\Rules\Tokens\BaseToken
as arguments,
and always must return one as well.
<?php $rule = 'array_filter([0, false, 1]) === [1]'; $result = $this->get('rule_parser')->isTrue($rule); var_dump($result); // bool(true)