PHP code example of yl0711-coder / ruleflow-php
1. Go to this page and download the library: Download yl0711-coder/ruleflow-php library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
yl0711-coder / ruleflow-php example snippets
if ($order->amount > 1000 && $user->risk_score < 60) {
return 'reject';
}
use RuleFlow\Engine;
use RuleFlow\RuleSet;
$rules = [
[
'name' => 'high_risk_order',
'priority' => 100,
'match' => 'all',
'conditions' => [
['field' => 'order.amount', 'operator' => '>', 'value' => 1000],
['field' => 'user.risk_score', 'operator' => '<', 'value' => 60],
],
'action' => 'reject',
'reason' => 'High-risk order able rule execution trace
use RuleFlow\Engine;
use RuleFlow\Loaders\JsonRuleLoader;
use RuleFlow\Validation\RuleValidator;
$rulesPath = __DIR__ . '/rules/order-risk.json';
$rules = json_decode((string) file_get_contents($rulesPath), true);
RuleValidator::defaults()->assertValid($rules);
$ruleSet = (new JsonRuleLoader($rulesPath))->load();
$result = Engine::make($ruleSet)->evaluate($context);
print_r($result->toArray());
[
'matched' => true,
'rule' => 'high_risk_order',
'action' => 'reject',
'reason' => 'High-risk order d' => true,
'match' => 'all',
'action' => 'reject',
'reason' => 'High-risk order sing' => false,
'sensitive' => false,
'actual' => 1299,
'operator' => '>',
'expected' => 1000,
'passed' => true,
'duration_ms' => 0.011,
],
[
'field' => 'user.risk_score',
'exists' => true,
'missing' => false,
'sensitive' => false,
'actual' => 45,
'operator' => '<',
'expected' => 60,
'passed' => true,
'duration_ms' => 0.009,
],
],
],
],
]
$trace = $result->trace();
$trace->matchedRuleNames(); // ['high_risk_order']
$trace->failedEntries(); // rules evaluated but not matched
$trace->skippedEntries(); // disabled rules
$trace->summary(); // matched, failed, skipped, and total duration
$explain = $result->explain();
[
'matched' => false,
'rule' => null,
'matched_rules' => [],
'action' => null,
'reason' => null,
'failure_reason' => 'field_missing',
'summary' => [
'evaluated_rules' => 1,
'matched_rules' => [],
'failed_rules' => ['phone_present'],
'skipped_rules' => [],
'duration_ms' => 0.031,
],
'rule_explanations' => [
[
'rule' => 'phone_present',
'matched' => false,
'skipped' => false,
'failure_reason' => 'field_missing',
'failed_checks' => [
[
'field' => 'user.phone',
'operator' => 'exists',
'expected' => null,
'actual' => null,
'failure_reason' => 'field_missing',
],
],
],
],
]
[
'name' => 'suspicious_content',
'match' => 'any',
'conditions' => [
['field' => 'post.content', 'operator' => 'contains', 'value' => 'free money'],
['field' => 'post.report_count', 'operator' => '>=', 'value' => 3],
],
'action' => 'manual_review',
]
[
'name' => 'high_risk_order',
'match' => 'all',
'conditions' => [
['field' => 'order.amount', 'operator' => '>', 'value' => 1000],
[
'match' => 'any',
'conditions' => [
['field' => 'user.risk_score', 'operator' => '<', 'value' => 60],
['field' => 'user.country', 'operator' => 'in', 'value' => ['NG', 'RU']],
],
],
],
'action' => 'manual_review',
]
$result = Engine::make(RuleSet::fromArray($rules))->evaluateAll($context);
$result->matched(); // true
$result->ruleNames(); // ['amount_review', 'risk_hold']
$result->actions(); // ['manual_review', 'hold']
$result->reasons(); // ['Amount threshold reached.', 'Risk score threshold reached.']
use RuleFlow\Engine;
use RuleFlow\Operators\OperatorInterface;
use RuleFlow\Operators\OperatorRegistry;
use RuleFlow\RuleSet;
final class RegexOperator implements OperatorInterface
{
public function name(): string
{
return 'regex';
}
public function evaluate(mixed $actual, mixed $expected): bool
{
return is_string($actual)
&& is_string($expected)
&& preg_match($expected, $actual) === 1;
}
}
$operators = OperatorRegistry::defaults();
$operators->register(new RegexOperator());
$result = Engine::makeWithOperators(RuleSet::fromArray($rules), $operators)->evaluate($context);
use RuleFlow\Validation\RuleValidator;
$validation = RuleValidator::defaults()->validate($rules);
if (!$validation->valid()) {
print_r($validation->errors());
}
'rules' => [
[
'name' => 'new_user_external_link',
'conditions' => [
['field' => 'user.days_since_signup', 'operator' => '<=', 'value' => 7],
['field' => 'post.links', 'operator' => 'contains', 'value' => 'https://example.com'],
],
'action' => 'manual_review',
],
],
'cache' => [
'enabled' => true,
'driver' => 'laravel', // or 'in_memory'
'store' => 'redis', // optional, uses default cache store when null
'key' => 'ruleflow.rules',
'ttl' => 300,
],
$result = app(\RuleFlow\RuleFlow::class)->evaluate($context);
bash
composer bash
composer config repositories.ruleflow vcs https://github.com/yl0711-coder/ruleflow-php
composer bash
php artisan vendor:publish --tag=ruleflow-config
bash
php artisan ruleflow:validate
bash
php examples/order-risk.php
php examples/content-moderation.php
php examples/json-loader.php
php examples/explain.php
bash
php benchmarks/evaluate.php