laravel 8 - 관리자 메뉴 설정방법

김문범·2020년 12월 24일
0

1. ViewComposer 설정

1-1. AdminMenuComposer.php 생성

위치 : app/Http/ViewComposers/AdminMenuComposer.php
위의 위치에 맞게 ViewComposers폴더 및 AdminMenuComposer.php파일을 생성함.

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;

class AdminMenuComposer
{
    protected $menus;
    protected $topMenus;

    public function __construct()
    {
        // 메뉴 설정 {
        $common = [
            [
                'title' => 'Dashboard',
                'url' => route('rhksfl.home', null, false), // 반드시 이렇게 작성함.
            ],
        ];

        $setting = [
            [
                'nav_title' => '사이트 관리',
                'title' => '게시판 관리',
                'url' => route('rhksfl.board-infos.index', null, false),
            ],
            [
                'title' => '메뉴 관리',
                'url' => route('rhksfl.home', null, false),
            ],
        ];
        // } 메뉴 설정

        $this->topMenus = [
            $setting[0],
        ];

        $prefix = explode('/', request()->route()->getPrefix());

        if (count($prefix) > 1) {
            $prefix = $prefix[1];
            $this->menus = $$prefix;
        } else {
            $this->menus = $common;
        }
    }

    public function compose(View $view)
    {
        $view->with('adminTopMenus', $this->topMenus);
        $view->with('adminMenus', $this->menus);

        $nowPath = request()->server('REQUEST_URI');

        $nowMenu = 0;
        $nowPosition = '';
        $topMenuTitle = 'Dashboard';
        $nowMenuTitle = '';

        if ($nowPath && !empty($this->menus)) {
            foreach ($this->menus as $index => $menu) {
                if (!empty($menu['nav_title'])) {
                    $topMenuTitle = $menu['nav_title'];
                }

                if (!empty($menu['sub'])) {
                    foreach ($menu['sub'] as $subIndex => $subMenu) {
                        if (preg_match('/^(' . str_replace('/', '\/', $subMenu['url']) . ')(\/|\?|$)/', $nowPath)) {
                            $nowMenu = $index;
                            $nowPosition = $subIndex;
                            $nowMenuTitle = $subMenu['title'];
                            break;
                        }
                    }
                } else {
                    if (preg_match('/^(' . str_replace('/', '\/', $menu['url']) . ')(\/|\?|$)/', $nowPath)) {
                        $nowMenu = $index;
                        $nowMenuTitle = $menu['title'];
                        break;
                    }
                }
            }
        }

        $view->with('topMenuTitle', $topMenuTitle);
        $view->with('nowMenuTitle', $nowMenuTitle);
        $view->with('nowMenu', $nowMenu);
        $view->with('nowPosition', $nowPosition);
    }
}

1-2. 메뉴 URL의 작성 이유

  1. 'url' => route('rhksfl.home', null, false),
    위와 같이 코드를 작성하면 아래의 사진과 같고

  1. 'url' => route('rhksfl.home'),
    위와 같이 코드를 작성하면 아래의 사진과 같다.

이러한 상황이 발생하면 1번의 경우 뒤에 무언가 더 주소가 추가되더라고 같은 메뉴라고 확인이 된다.
하지만, 2번의 경우는 같은 메뉴라고 확인이 안됨.

1-3. route()에 대한 설명

1-4. View(메뉴관련)파일 설정

<nav class="navbar navbar-light bg-white p-0">
    <ul class="nav flex-column w-100">
        @foreach($adminMenus as $index => $menu)
            @if(!empty($menu['nav_title']))
                <li class="nav-item bg-primary text-white px-2 py-3 font-weight-bold">
                    {{ $menu['nav_title'] }}
                </li>
            @endif

            @if(!empty($menu['sub']))
                <li class="nav-item border-bottom">
                    <p class="mb-0 px-2">{{ $menu['title'] }}</p>
                    <ul class="nav flex-column">
                        @foreach($menu['sub'] as $subIndex => $subMenu)
                            <li class="nav-item">
                                <a class="nav-link @if($nowMenu === $index && $nowPosition === $subIndex) active @endif "
                                   href="{{ $subMenu['url'] }}">
                                    {{ $subMenu['title'] }}
                                </a>
                            </li>
                        @endforeach
                    </ul>
                </li>
            @else
                <li class="nav-item border-bottom">
                    <a class="nav-link @if($nowMenu === $index) active @endif " href="{{ $menu['url'] }}">
                        {{ $menu['title'] }}
                    </a>
                </li>
            @endif
        @endforeach
    </ul>
</nav>

2. 프로바이더 설정

2-1. 프로바이더 생성

php artisan make:provider ComposerServiceProvider
그러면, app/Providers/ComposerServiceProvider.php에 파일이 생성됨.

2-2. ComposerServiceProvider.php 코드 작성

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composer(
            ['admin.layouts.app'], 'App\Http\ViewComposers\AdminMenuComposer' // 이 부분 추가함.
        );
    }
}

2-3. 프로바이더 등록

위치 : config/app.php

"추가함"이라고 한 부분을 추가하면 프로바이더 등록 완료.

profile
다양하지만 공부할 것이 많은 개발자입니다.

0개의 댓글