besnovatyj/yii2-nested-sets

Nested Sets ядро для Yii2: Service/Repository/ColumnMap без привязки к конкретному модулю. Одна из реализаций дерева для besnovatyj/yii2-cms-tree-manager.

Maintainers

Package info

github.com/besnovatyj/yii2-nested-sets

Type:yii2-extension

pkg:composer/besnovatyj/yii2-nested-sets

Transparency log

Statistics

Installs: 1

Dependents: 2

Suggesters: 0

Stars: 0

Open Issues: 0

v1.1.0 2026-07-06 18:50 UTC

This package is auto-updated.

Last update: 2026-07-08 15:36:57 UTC


README

Nested Sets ядро для Yii2: операции над деревом без behavior-методов на AR-моделях и без привязки к конкретному модулю. Multi-tree (tree-колонка), глубина (depth), опциональная сортировка корней отдельной колонкой (sort_order).

Выделено из besnovatyj/yii2-cms-tree-manager (фаза 3 плана разделения — TODO.MD того пакета). Tree-manager — фасад работы с деревом; этот пакет — одна из реализаций (абстракция «других подходов» — materialized path и т.п. — появится отдельной фазой, когда возникнет вторая реализация).

Состав

Класс Роль
NestedSetsService Высокоуровневые операции: create (root/prepend/append/before/after), move (включая makeRoot и сортировку корней moveRootBefore/After/ToFirst/ToLast/ToPosition, swapRoots, reindexRoots), delete (deleteWithChildren / deletePromotingChildren / deleteLeaf). Все операции — в транзакции.
NestedSetsRepository Низкоуровневая работа с БД: выборки (roots/parents/descendants/children/leaves/prev/next), предикаты (isRoot/isLeaf/isChildOf), populateTree, сдвиги lft/rgt (shift), вставка/перемещение/удаление на уровне запросов.
NestedSetsColumnMap Карта структурных колонок (lft/rgt/depth/tree/sort) — имена не хардкодятся; по ней же определяется, какие атрибуты модели «структурные», а какие — пользовательские.
NestedSetsException Доменное исключение (нарушение инвариантов дерева: второй корень в single-tree, вставка before/after корня, перемещение в собственного потомка и т.п.). В фасаде маппится на HTTP 422.

Использование

use Besnovatyj\NestedSets\NestedSetsColumnMap;
use Besnovatyj\NestedSets\NestedSetsRepository;
use Besnovatyj\NestedSets\NestedSetsService;

$columns = new NestedSetsColumnMap(
    leftAttribute: 'lft',
    rightAttribute: 'rgt',
    depthAttribute: 'depth',
    treeAttribute: 'tree',        // null — режим одного дерева
    sortAttribute: 'sort_order',  // null — корни без отдельной сортировки
);

$repository = new NestedSetsRepository(Menu::class, $columns, Yii::$app->db);
$service = new NestedSetsService($repository);

$service->createRoot($menu);                  // новый корень (вернёт id)
$service->appendTo($parent, $item);           // последним ребёнком
$service->moveBefore($node, $target);         // перед узлом
$service->makeRoot($node);                    // поддерево -> новый корень
$service->moveRootBefore($rootA, $rootB);     // сортировка корней (sort_order)
$service->deleteWithChildren($node);          // удалить с поддеревом
$service->deletePromotingChildren($node);     // удалить, подняв детей к родителю

Требования к таблице: lft/rgt/depth (имена настраиваются), при multi-tree — колонка дерева, при сортируемых корнях — колонка сортировки у корней.

Контракты

  • Доменные ошибки — только NestedSetsException (extends RuntimeException): ловите его на границе (см. TreeController::execute() фасада — 422 наружу).
  • Операции сервиса транзакционны; репозиторий транзакций не открывает.
  • Пакет зависит только от yiisoft/yii2 (yii\db\*).

Связанные пакеты

  • besnovatyj/yii2-cms-tree-manager — Yii2-фасад: TreeManager/TreeDataSource, PHP TreeWidget, generic TreeController (использует этот пакет).
  • @besnovatyj/tree-widget-core (npm) — TS-виджет дерева, клиентская сторона.

License

MIT — см. LICENSE. Автор: Besnovatyj.