경로가 많아 코드가 어지럽다.
<?php
use App\Http\Controllers\BoardController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\RegisterController;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
// 게시판
Route::get('/boards', [BoardController::class, 'index'])->name('boards.index');
Route::get('/boards/create', [BoardController::class, 'create'])->name('boards.create');
Route::post('/boards/store', [BoardController::class, 'store'])->name('boards.store');
Route::get('boards/{board}',[BoardController::class, 'show'])->name("boards.show");
Route::patch('boards/{board}', [BoardController::class, 'update'])->name('boards.update');
// 회원가입
Route::get('/register/registerService', [RegisterController::class, 'registerService'])->name('registerService');
Route::post('/register/register', [RegisterController::class, 'register'])->name('register');;
// 로그인
Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login');
Route::post('/login', [LoginController::class, 'login']);
// 삭제
Route::delete('/boards/{board}', [BoardController::class, 'delete'])->name('boards.delete');
라우트 그룹(경로 그룹)을 사용하면 각 개별 경로에서 속성을 정의할 필요 없이 같은 경로 속성을 공유할 수 있다.
중첩된 그룹은 부모 그룹과 속성을 병합(merge)한다.
Middleware
그룹 내의 모든 라우트에 미들웨어를 할당하려면 그룹을 정의하기 전에 middleware 메소드를 사용하면 된다.
미들웨어는 배열에 나열된 순서대로 실행된다.
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second middleware...
});
Route::get('/user/profile', function () {
// Uses first & second middleware...
});
});
Route::middleware([CheckBoardOwnership::class])->group(function () {
Route::get('boards/{board}', [BoardController::class, 'show'])->name("boards.show");
Route::patch('boards/{board}', [BoardController::class, 'update'])->name("boards.update");
Route::delete('/boards/{board}', [BoardController::class, 'delete'])->name('boards.delete');
});
Route::middleware([CheckBoardOwnership::class])->group(function () {
Route::controller(BoardController::class)->group(function () {
Route::get('boards/{board}', 'show')->name("boards.show");
Route::patch('boards/{board}', 'update')->name("boards.update");
Route::delete('/boards/{board}', 'delete')->name('boards.delete');
});
});
Controllers
라우트 그룹이 모두 동일한 컨트롤러를 사용하는 경우 controller 메서드를 사용하여 공통 컨트롤러를 정의할 수 있다.
경로를 정의할 때 해당 경로가 호출하는 컨트롤러 메서드만 제공하면 된다.
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});
Subdomain Routing
서브 도메인을 처리하는 데에도 라우트 그룹을 사용할 수 있다.
서브 도메인은 라우트 URI와 같이 서브 도메인의 일부를 추출해서 라우트 파라미터로 할당할 수 있다.
서브 도메인은 그룹을 정의하기 전에 domain 메서드를 호출하여 지정할 수 있다.
이때 서브 도메인 경로에 도달할 수 있도록 하려면 루트 도메인 경로를 등록하기 전에 서브 도메인 경로를 등록해야 한다.
그렇게 하면 루트 도메인 경로가 동일한 URI 경로를 가진 하위 도메인 경로를 덮어쓰는 것을 방지할 수 있다.
Route::domain('{account}.example.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
라우트 그룹을 사용하여 수정한 코드는 다음과 같다.
같은 컨트롤러를 사용하는 라우트들끼리 묶어주었다.
<?php
use App\Http\Controllers\BoardController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\RegisterController;
use App\Http\Controllers\TestController;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
Route::controller(BoardController::class)->group(function () {
Route::get('/boards', 'index')->name('boards.index');
Route::get('/boards/create', 'create')->name('boards.create');
Route::post('/boards/store', 'store')->name('boards.store');
Route::get('boards/{board}','show')->name("boards.show");
Route::patch('boards/{board}', 'update')->name('boards.update');
Route::delete('/boards/{board}', 'delete')->name('boards.delete');
});
Route::controller(RegisterController::class)->group(function () {
Route::get('/register/registerService', 'registerService')->name('registerService');
Route::post('/register/register', 'register')->name('register');
});
Route::controller(LoginController::class)->group(function () {
Route::get('/login', 'showLoginForm')->name('login');
Route::post('/login', 'login');
});
Route::controller(BoardController::class)->group(function () {
Route::get('/boards', 'index')->name('boards.index');
Route::get('/boards/create', 'create')->name('boards.create');
Route::post('/boards/store', 'store')->name('boards.store');
Route::middleware([CheckBoardOwnership::class])->group(function () {
Route::get('boards/{board}', 'show')->name("boards.show");
Route::patch('boards/{board}', 'update')->name("boards.update");
Route::delete('/boards/{board}', 'delete')->name('boards.delete');
});
});