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-03-05 13:32:48 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