카테고리 없음

laravel 라라벨 라우트 그룹

백위한 2024. 5. 9. 20:59

경로가 많아 코드가 어지럽다.

<?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');
    });
});