besnovatyj/yii2-nested-sets
Composer 安装命令:
composer require besnovatyj/yii2-nested-sets
包简介
Nested Sets ядро для Yii2: Service/Repository/ColumnMap без привязки к конкретному модулю. Одна из реализаций дерева для besnovatyj/yii2-cms-tree-manager.
关键字:
README 文档
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(extendsRuntimeException): ловите его на границе (см.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.
统计信息
- 总下载量: 1
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 2
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-07-06