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);
}
}
위치 : 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);
});
});
위치 : app/Http/Kernel.php
Kernel.php에 'level' => \App\Http\Middleware\CheckLevel::class,이라는 부분을 추가함.
위치 : 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'));
// } 추가한 부분
});
}
위치 : 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부터는 주석처리가 되어 있음.
이 때문에 라우트 파일 작성 방법도 변화가 생김.
위치 : resources/views/front
views폴더에 front폴더를 만듬.
그리고 기존에 있던 layouts폴더와 welcome.blade.php파일을 넣음.
위치 : resources/views/admin
views폴더에 admin폴더를 만듬.
home.blade.php파일을 admin폴더에 넣음.
그리고 front폴더의 내용과 같이 만들고 구분만 가능하도록 해서 나중에 확인한다.
위치 : app/Http/Controllers/Front
Front폴더를 Controllers폴더 밑에 생성함.
나중에 사용자 페이지에 필요한 컨트롤러 생성 시 사용 할 폴더임.
위치 : 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');
}
}
위치 : routes/web.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('front.welcome');
})->name('welcome');
Auth::routes();
위치 : 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);
});
});
5-2. 관리자 페이지 라우트 파일 작성후 /home 로 접속해봤는데 404에러가 뜹니다.
콘트롤러랑 뷰 파일 구성을 어떻게 해야하나요?