Larvel Tips - 1

김문범·2021년 8월 26일
1

laravel-tips

목록 보기
1/1

주제 : Route

1. 기본 route 작성방법

1-1. laravel 8버전 이상

<?php

Route::get('board', [\App\Http\Controllers\BoardController::class, 'index']);

또는

<?php

use App\Http\Controllers\BoardController

Route::get('board', [BoardController::class, 'index']);

1-2. laravel 8버전 미만

Route::get('board', 'BoardController@index');

이렇게 버전에 따라 8버전을 기준으로 차이가 발생한다.


2. 사용자 및 관리자 등 페이지 분리방법

2-1. RouteServiceProvider 이용방법

위치 : app/Provider/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)
                ->prefix('admin')
                ->group(base_path('routes/admin.php'));
           // } 추가한 부분
        });
    }

위와 같이 작성하면 된다.

추가한 코드를 설명한다면, 미들웨어는 'web' 및 'auth'를 거치기 때문에
쿠키, 세션 등 'web'이라는 미들웨어, 정확히는 미들웨어 그룹에 묶여있는 코드들이 적용된다.

'kernel.php' 를 확인해 보면, 아래와 같은 부분이 있다.

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

여기 'web'에 해당하는 부분이 적용된다는 말이다.
그리고, 'auth'는 로그인 관련이기 때문에 로그인을 못하면 접근이 불가능하게 처리가 된다.

프리픽스는 예를 들어 URL이 http://localhost 라면, prefix('admin')을 하게되면 http://localhost/admin이 기본이 되어서 처리가 된다.

그룹은 route를 작성하는 파일을 지정하면 된다.

2-2. web.php에서 Group로 나누어서 파일 하나로 처리하는 방법

<?php

use Illuminate\Support\Facades\Route;

// 공통 부분
require __DIR__.'/auth.php';

// 사용자 페이지 부분
Route::get('/', [\App\Http\Controllers\User\IndexController::class, 'index'])->name('home');

// 관리자 페이지 부분
Route::group([
    'as' => 'admin.',
    'middleware' => ['auth', 'checkLevel:admin', 'checkGroup:A'],
], function () {
    Route::get('/home', [\App\Http\Controllers\Admin\IndexController::class, 'index'])
        ->name('home');
});

위와 같은 방법으로 처리는 가능하다. 그러면, Provider 방식을 제외하고 코드를 작성해야함.

'middleware' => ['auth', 'checkLevel:admin', 'checkGroup:A'],이라는 부분은 미들웨어 3곳을 지나쳐야 한다는 말이다. 로그인 여부, 권한 확인(admin 레벨), 그룹 확인(A 그룹)을 해야지 관리자 페이지에 접근이 가능하다는 말이다.
'checkLevel', 'checkGroup'은 따로 만든 미들웨어이다. 미들웨어 작성은 밑에서 다루겠다.

'as' => 'admin.',이라는 부분은 route name을 name('home')과 같이 지정했을때 admin.home과 같이 앞에 붙는 부분을 지정하는 내용이다.

자세히 살펴보면, 'RouteRegistrar.php' 라는 파일을 찾아보면

protected $allowedAttributes = [
        'as', 'domain', 'middleware', 'name', 'namespace', 'prefix', 'where',
    ];

이렇게 7개의 속성을 받을 수 있고,

protected $aliases = [
        'name' => 'as',
    ];

이렇게 가명?, 별명?이 설정되어서 Route::group()에서 'as' 도 같은 의미로 'name' 을 쓰면 'admin.home' 이 되는 줄 알았지만, 적용이 안된다.
더 파고들어서 'RouteGroup.php' 를 찾아보면

protected static function formatAs($new, $old)
    {
        if (isset($old['as'])) {
            $new['as'] = $old['as'].($new['as'] ?? '');
        }

        return $new;
    }

이 부분은 있어서 'as' 로 처리한다면 route name이 설정되지만, 'name' 으로 지정하면 처리하는 부분이 없다.


3. 미들웨어 작성방법

php artisan make:middleware [원하는 파일명]을 통해 만들고,

public function handle(Request $request, Closure $next)
    {
        return $next($request);
    }

기본 코드를 수정하면 된다.

route에서 'middleware' => 'checkLevel:admin'에서 'admin' 이라는 부분이 '$role' 이라는 파라미터로 받을 수 있다.

그래서 아래와 같은 방법으로 접근 권한을 제한하는 미들웨어를 작성하였다.

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);
    }
profile
다양하지만 공부할 것이 많은 개발자입니다.

0개의 댓글