66호. 라라벨에 라우트를 등록하는 더 나은 방법 free

2019-10-04

라라벨 5.6부터 라우트를 정의할 때 배열 문법을 사용할 수 있게 되었습니다. (#24385) 이에 기반해서 스파티의 프릭이 라우트를 등록하는 더 나은 방법(원문: A better way to register routes in Laravel)을 소개했습니다.


결론부터 말씀드리면 RouteServiceProvider에서 namespace()를 호출하는 부분을 지운 다음, 라우트를 아래와 같이 작성하라는 것입니다. 튜플 문법(tuple syntax) 혹은 튜플 어노테이션이라고 표현하네요.


use App\Http\Controllers\MyController;

Route::get('my-route', [MyController::class, 'index']);

이런식으로 라우트를 작성해서 얻을 수 있는 장점은 두 가지 입니다.



  1. PHPStorm 같은 IDE를 사용한다면 라우트 파일에서 클릭해서 컨트롤러로 이동할 수 있다.

  2. 컨트롤러의 네임스페이스를 리팩토링하면 라우트 파일에 있는 것도 함께 변경된다.


튜플 문법으로 작성하면 라우트에 use 구문을 적어줘야하고, 또 그 양이 엄청 많아지긴할텐데, IDE가 자동으로 작성해주고 안보이게 숨겨줄테니 크게 불편하진 않을 겁니다. 위에 언급한 장점도 사실 IDE를 쓴다는 전제하에 얻을 수 있는 장점이긴 합니다. 혹시 코드 자동 생성, 자동 완성, 네비게이션 기능이 없는 코드 에디터를 사용하고 있다면 하루라도 빨리 에디터를 변경하세요! 다른 어떤걸 공부하는 것보다도 생산성 향상에 즉각적인 도움이 될 것입니다 :)


action을 이용한 리다이렉트에도 이 방식을 사용할 수 있습니다.


namespace App\Http\Controllers;

class MyController
{
    public function myMethod()
    {
        // do some work...

        return redirect->action([MyOtherController::class, 'index']);
    }
}

invokable 컨트롤러를 쓸 때는 아래와 같이 합니다.


use App\Http\Controllers\MyController;

Route::get('my-route', MyController::class);

이 방식으로 전환하고자 하실 때 아래와 같이 내장 인증 라우트를 사용하고 있으면 주의하셔야 합니다.


// web.php
Auth::routes(['verify' => true]);

실제로 실행되는 Illuminate\Routing\Router::auth가 다음과 같이 작성되어 있기 때문입니다. web 라우트의 네임스페이스 호출을 제거했기 때문에 App\Http\Controllers\Auth\LoginController가 아닌 Auth\LoginController가 호출되서 에러가 발생합니다.


// Illuminate\Routing\Router 
public function auth(array $options = [])
    {
        // Authentication Routes...
        $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
        $this->post('login', 'Auth\LoginController@login');
        $this->post('logout', 'Auth\LoginController@logout')->name('logout');

인증 라우트를 호출하는 부분만 namespace()로 그룹핑해서 해결할 수 있습니다.


// web.php
Route::namespace('App\Http\Controllers')->group(function() {
    Auth::routes(['verify' => true]);
});

1일 1식 라라벨 66호


2019년 10월 4일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.