<?php
Route::get('board', [\App\Http\Controllers\BoardController::class, 'index']);
또는
<?php
use App\Http\Controllers\BoardController
Route::get('board', [BoardController::class, 'index']);
Route::get('board', 'BoardController@index');
이렇게 버전에 따라 8버전을 기준으로 차이가 발생한다.
위치 : 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를 작성하는 파일을 지정하면 된다.
<?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' 으로 지정하면 처리하는 부분이 없다.
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);
}