Laravel 8 - 관리자 및 사용자 페이지 분리

김문범·2020년 12월 22일
0

1. 미들웨어 설정

1-1. 미들웨어 생성

php artisan make:middleware CheckLevel

미들웨어를 생성하게 되면 아래와 같은 기본 코드가 생김.

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }

        return $next($request);
    }
}

1-2. 미들웨어 작성

위치 : app/Http/Middleware/CheckLevel.php

그럼 아래의 코드와 같이 변경함.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckLevel
{
    public function handle(Request $request, Closure $next, $role)
    {
        switch ($role) {
            case 'admin':
            case 'user':
                if (auth()->user()->user_level < config("ext.user.user_level.roles.{$role}.level")) {
                    return redirect('/');
                }
                break;
            default:
                return redirect('/');
                break;
        }

        return $next($request);
    }
}

$role은 미들웨어 파라미터로 $next의 다음으로 받을 수 있음.
(아래의 코드에 주석을 확인)

<?php

use App\Http\Controllers\Admin\HomeController;
use App\Http\Controllers\Admin\Setting\BoardController;
use Illuminate\Support\Facades\Route;

Route::group([
    'as' => 'rhksfl.',
    'middleware' => ['level:admin'], // 이 부분이 미들웨어 파라미터("admin"이라는 값이 넘어감.)
], function () {
    Route::get('home', [HomeController::class, 'index'])->name('home');

    Route::group([
        'prefix' => 'setting',
    ], function () {
        Route::resource('board-infos', BoardController::class);
    });
});

1-3. 커널 등록

위치 : app/Http/Kernel.php
Kernel.php에 'level' => \App\Http\Middleware\CheckLevel::class,이라는 부분을 추가함.


2. 프로바이더 설정

2-1. 프로바이더 작성(laravel 8버전 이상 사용 시)

위치 : app/Providers/RouteServiceProvider.php

public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
            
            // 추가한 부분 {
            Route::middleware('web', 'auth')
                ->prefix('rhksfl')
                ->group(base_path('routes/admin.php'));
            // } 추가한 부분
        });
    }

2-2. 프로바이더 작성(laravel 8버전 미만 사용 시)

위치 : app/Providers/RouteServiceProvider.php

public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
            
            // 추가한 부분 {
            Route::middleware('web', 'auth')
                ->namespace($this->namespace. '\Admin')
                ->prefix('rhksfl')
                ->group(base_path('routes/admin.php'));
            // } 추가한 부분
        });
    }

이러한 변화가 발생한 이유는 아래와 같다.

protected $namespace = 'App\\Http\\Controllers';

이 코드가 laravel 8부터는 주석처리가 되어 있음.
이 때문에 라우트 파일 작성 방법도 변화가 생김.


3. 뷰 분리

3-1. 사용자 페이지 뷰 분리하기

위치 : resources/views/front
views폴더에 front폴더를 만듬.
그리고 기존에 있던 layouts폴더와 welcome.blade.php파일을 넣음.

3-2. 관리자 페이지 뷰 분리하기

위치 : resources/views/admin
views폴더에 admin폴더를 만듬.
home.blade.php파일을 admin폴더에 넣음.
그리고 front폴더의 내용과 같이 만들고 구분만 가능하도록 해서 나중에 확인한다.


4. 컨트롤러 분리

4-1. 사용자 페이지 컨트롤러 분리하기

위치 : app/Http/Controllers/Front
Front폴더를 Controllers폴더 밑에 생성함.
나중에 사용자 페이지에 필요한 컨트롤러 생성 시 사용 할 폴더임.

4-2. 관리자 페이지 컨트롤러 분리하기

위치 : app/Http/Controllers/Admin
Admin폴더를 Controllers폴더 밑에 생성함.
관리자 페이지에 필요한 컨트롤러 생성 시 사용 할 폴더임.
그리고 HomeController.php파일을 Admin폴더에 넣음.
아래와 같은 코드로 약간의 수정이 필요함.

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class HomeController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        return view('admin.home');
    }
}

5. 라우트 파일 설정

5-1. 사용자 페이지 라우트 파일 작성

위치 : routes/web.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('front.welcome');
})->name('welcome');

Auth::routes();

5-2. 관리자 페이지 라우트 파일 작성

위치 : routes/admin.php
web.php파일을 복사해서 만듬.

<?php

use App\Http\Controllers\Admin\HomeController;
use App\Http\Controllers\Admin\Setting\BoardController;
use Illuminate\Support\Facades\Route;

Route::group([
    'as' => 'rhksfl.',
    'middleware' => ['level:admin'], // 이 부분이 미들웨어 파라미터("admin"이라는 값이 넘어감.)
], function () {
    Route::get('home', [HomeController::class, 'index'])->name('home');

    Route::group([
        'prefix' => 'setting',
    ], function () {
        Route::resource('board-infos', BoardController::class);
    });
});
profile
다양하지만 공부할 것이 많은 개발자입니다.

2개의 댓글

comment-user-thumbnail
2022년 1월 3일

5-2. 관리자 페이지 라우트 파일 작성후 /home 로 접속해봤는데 404에러가 뜹니다.
콘트롤러랑 뷰 파일 구성을 어떻게 해야하나요?

1개의 답글