mb4it / conditionable
A lightweight PHP library providing a fluent API for building and evaluating complex conditional logic structures.
dev-master
2026-02-05 13:17 UTC
Requires
- php: >=8.1
Requires (Dev)
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2026-04-05 13:41:23 UTC
README
Легковесная PHP-библиотека с fluent API для построения и вычисления сложных условных логических структур.
Возможности
- Fluent API: Интуитивно понятный интерфейс для построения условий
- Гибкие операторы: Поддержка множества операторов сравнения и проверки типов
- Контекстная система: Разрешение значений из объектов, массивов и классов
- Вложенные условия: Создание сложных логических деревьев с AND/OR
- Trait-интеграция: Встроенный трейт для добавления возможностей в ваши классы
- Расширяемость: Легкое добавление пользовательских операторов
Установка
Требуется PHP 8.1 или выше.
composer require mb4it/conditionable
Быстрый старт
Простые условия
$result = (new ConditionTree()) ->where(fn() => time(), '>', 0) ->result(); //true //Или использовать функцию $result = condition() ->where(fn() => time(), '>', 0) ->result(); // true
Контекст объекта
class User { public string $name = 'John'; public int $age = 25; } $user = new User(); $result = condition() ->context($user, 'u') ->where('u.name', 'John') ->where('u.age', '>=', 18) ->result(); // true // или $result = condition(['u' => $user]) ->where('u.name', 'John') ->where('u.age', '>=', 18) ->result(); // true
Использование Trait
use MB\Support\Conditionable\Traits\Conditionable; class Product { use Conditionable; public float $price = 150.0; public string $category = 'electronics'; } $product = new Product(); // При использовании Trait классе // Его алиас для контекста -> this $result = $product->condition() ->where('this.price', '>', 100) ->where('this.category', 'electronics') ->result(); // true
Или используйте метод check() для быстрой проверки:
$result = $product->check(['this.price', '>', 100], ['this.category', 'electronics']); // true
Доступные операторы
Операторы сравнения
| Оператор | Описание | Пример |
|---|---|---|
= |
Равно | where('field', '=', 'value') |
<> или != |
Не равно | where('field', '<>', 'value') |
=== |
Строгое равенство | where('field', '===', 'value') |
!== |
Строгое неравенство | where('field', '!==', 'value') |
> |
Больше | where('field', '>', 10) |
>= |
Больше или равно | where('field', '>=', 10) |
< |
Меньше | where('field', '<', 10) |
<= |
Меньше или равно | where('field', '<=', 10) |
Операторы коллекций
| Оператор | Описание | Пример |
|---|---|---|
in |
Входит в массив | in('field', [1, 2, 3]) |
between |
В диапазоне | between('field', 10, 20) |
Строковые операторы
| Оператор | Описание | Пример |
|---|---|---|
like |
LIKE-поиск | like('field', 'prefix%') |
regex |
Регулярное выражение | regex('field', '/^pattern$/') |
Операторы классов
| Оператор | Описание | Пример |
|---|---|---|
instanceof |
Проверка экземпляра | instanceof($object, SomeClass::class) |
implement |
Реализует интерфейс | implement(Class::class, SomeInterface::class) |
extends |
Наследует класс | extends(Class::class, ParentClass::class) |
uses_trait |
Использует трейт | usesTrait(Class::class, SomeTrait::class) |
has_method |
Имеет метод | hasMethod(Class::class, 'methodName') |
has_property |
Имеет свойство | hasProperty(Class::class, 'propertyName') |
has_public_property |
Имеет публичное свойство | hasPublicProperty(Class::class, 'propertyName') |
Продвинутое использование
Логика AND/OR
condition() ->logicOr() // по умолчанию 'and' ->where('field1', 'value1') ->where('field2', 'value2') ->calculate() ->result(); // Или condition() ->orGroup( function(ConditionTree $tree) { $tree ->where('field1', 'value1') ->where('field2', 'value2'); } ) ->result();
Отрицание условий
// Отрицание всего условия $tree = condition() ->where('field', 'value') ->negative() ->result(); // Отрицание отдельного условия condition() ->notGroup(fn (ConditionTree $cond) => $cond->where('field', 'value')) ->result();
Вложенные условия
$inner = condition() ->logicOr() ->where('field1', 'value1') ->where('field2', 'value2') $result = condition() ->where('mainField', 'mainValue') ->where($inner) ->result();
Разрешение значений из контекста
$array = ['age' => 25]; $policy = ['minAge' => 18]; condition() ->context($array, 'data') ->context($policy, 'rule') ->where('data.age', '>=', 'rule.minAge') ->result();
Поддержка callable
condition() ->where(fn() => getValue(), '>', 10) ->where([SomeClass::class, 'staticMethod'], '=', 'expected') ->result();
Callback при выполнении условия
$result = condition() ->where('field', 'value') ->calculate() ->then( function(bool $isTrue, Registry $context) { ... } ) ->result();
Создание пользовательских операторов
Реализуйте интерфейс ActionInterface и зарегистрируйте действие:
use MB\Support\Conditionable\Contracts\ActionInterface; use MB\Support\Conditionable\Actions\ActionRegistry; class CustomAction implements ActionInterface { public static function operator(): string { return 'custom_operator'; } public static function handle($a, $b): bool { // ваша логика return $a === $b; } } // Регистрация ActionRegistry::register(CustomAction::class); // Использование condition() ->where('field', 'custom_operator', 'value') ->result();
Тестирование
# Установка зависимостей composer install # Запуск тестов ./vendor/bin/phpunit
Структура проекта
├── src/
│ ├── Actions/ # Реализации операторов
│ │ └── Class/ # Операторы для работы с классами
│ ├── Context/ # Система контекстов
│ ├── Contracts/ # Интерфейсы
│ ├── Traits/ # Трейты для интеграции
│ ├── Condition.php # Условие
│ ├── ConditionTree.php # Дерево условий
│ └── functions.php # Глобальные функции
├── tests/ # Тесты PHPUnit
└── composer.json
Лицензия
MIT