FrontMenuTreeResolver.php 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <?php
  2. namespace Webkul\BagistoApi\Resolver;
  3. use ApiPlatform\GraphQl\Resolver\QueryCollectionResolverInterface;
  4. use Webkul\BagistoApi\Models\FrontMenuItem;
  5. /**
  6. * Resolves the enabled front navigation menu as a hierarchical tree.
  7. */
  8. class FrontMenuTreeResolver implements QueryCollectionResolverInterface
  9. {
  10. public function __invoke(?iterable $collection, array $context): iterable
  11. {
  12. $items = FrontMenuItem::query()
  13. ->where('status', 1)
  14. ->orderBy('sort_order')
  15. ->orderBy('id')
  16. ->get();
  17. return $this->buildTree($items);
  18. }
  19. /**
  20. * Recursively build the menu tree from a flat collection.
  21. *
  22. * Only enabled (status = 1) items are kept at every level, so a disabled
  23. * item is excluded whether it is a root node or a nested child.
  24. */
  25. protected function buildTree($items, ?int $parentId = null): array
  26. {
  27. $tree = [];
  28. foreach ($items as $item) {
  29. // Exclude disabled items at every level.
  30. if (! $item->status) {
  31. continue;
  32. }
  33. $itemParentId = $item->parent_id === null ? null : (int) $item->parent_id;
  34. if ($itemParentId === $parentId) {
  35. $children = $this->buildTree($items, (int) $item->id);
  36. $item->setRelation('children', collect($children));
  37. $tree[] = $item;
  38. }
  39. }
  40. return $tree;
  41. }
  42. }