Admin.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace App\Http\Middleware\Prepare;
  3. use Closure;
  4. use Illuminate\Support\Facades\View;
  5. use Spatie\Menu\Laravel\Facades\Menu;
  6. use Spatie\Menu\Laravel\Link;
  7. use Spatie\Menu\Laravel\Html;
  8. use Exception;
  9. class Admin
  10. {
  11. /**
  12. * Handle an incoming request.
  13. *
  14. * @param \Illuminate\Http\Request $request
  15. * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  16. * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  17. */
  18. public function handle($request, Closure $next)
  19. {
  20. $menus = config(key: 'menus');
  21. // 관리자 메뉴 설정
  22. $routers = $this->routers($menus);
  23. // 현재 메뉴 위치 조회
  24. $menus = $this->buildMenu($menus, $routers);
  25. View::share('menus', $menus);
  26. unset($menus, $routers, $menus);
  27. return $next($request);
  28. }
  29. /**
  30. * 관리자 메뉴 배열화
  31. */
  32. private function routers(array $menus, $arr = [], $parent = null)
  33. {
  34. foreach ($menus as $controller => $row) {
  35. $info = (key($row) == '/' ? current($row) : $row);
  36. if ($parent) {
  37. $segment = [
  38. ADMIN_PATH,
  39. $parent,
  40. $controller
  41. ];
  42. } else {
  43. $segment = [
  44. ADMIN_PATH,
  45. $controller
  46. ];
  47. }
  48. $arr[$info[1]] = join(DIRECTORY_SEPARATOR, $segment);
  49. if (isset($info[5]) && $info[5]) {
  50. $arr = $this->routers($info[5], $arr, $controller);
  51. }
  52. }
  53. return $arr;
  54. }
  55. /**
  56. * 관리자 메뉴 생성
  57. */
  58. private function buildMenu(array $menus, array $routers): \Spatie\Menu\Menu|callable
  59. {
  60. $menu = Menu::new();
  61. foreach ($menus as $row) {
  62. $info = (key($row) == '/' ? current($row) : $row);
  63. $router = (array_key_exists($info[1], $routers) ? $routers[$info[1]] : "");
  64. try {
  65. $link = Link::to(url($router),
  66. (
  67. ($info[3] ? Html::raw(sprintf('<i class="%s"></i>', $info[3]))->render() : '') .
  68. Html::raw(sprintf('<span class="ps-2">%s</span>', $info[2]))->render()
  69. )
  70. )->addClass('nav-link')->setActive(function () use($router) {
  71. return request()->is($router);
  72. });
  73. if (isset($info[5]) && $info[5]) {
  74. $id = ('menu_' . $info[1]);
  75. $menu->submenu(
  76. // 상위 메뉴
  77. $link->setAttributes([
  78. 'data-bs-target' => ('#' . $id),
  79. 'data-bs-toggle' => 'collapse',
  80. 'role' => 'button',
  81. 'aria-expanded' => 'false',
  82. 'aria-controls' => $id
  83. ])->setActive(function () use($router) {
  84. return request()->is($router . '/*');
  85. }),
  86. // 하위 메뉴
  87. Menu::new()
  88. ->withoutWrapperTag()
  89. ->withoutParentTag()
  90. ->html(
  91. sprintf('<div id="%s" class="collapse">%s</div>', $id, $this->buildMenu($info[5], $routers))
  92. )
  93. );
  94. }else{
  95. $menu->add(
  96. $link
  97. );
  98. }
  99. } catch (Exception) {
  100. exit('관리자 메뉴 설정 값이 잘못되었습니다.');
  101. }
  102. }
  103. return $menu->addClass('nav flex-column');
  104. }
  105. }