대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법

Guanhui
풀어 주다: 2020-05-08 14:15:26
앞으로
2503명이 탐색했습니다.

게스트, 사용자, 관리자 등을 위한 분리된 모듈을 포함하여 100개 이상의 경로가 있는 Laravel 프로젝트를 상상해 보세요. 정말로 모든 것을 하나의 파일에 쓰고 싶습니까? 그렇다면 이들을 그룹화하고 URL에 접두어를 추가하려면 어떻게 해야 할까요? 어떤 방법이 있는지 살펴보겠습니다

1. WEB 및 API 라우팅을 분리합니다

Laravel이 이미 이를 수행했기 때문에 이는 간단합니다. 다음 두 파일이 있습니다:

routes/web.php

routes/api.php

따라서 프로젝트에 프런트엔드 페이지와 API가 모두 있는 경우(사용 시나리오가 점점 더 넓어지고 있음) API를 넣어주세요. api.php에서 라우팅합니다.

예를 들어 /users 페이지와 /api/users/ 엔드포인트가 있는 경우 동일한 파일에 동일한 이름이 나타나서 발생하는 혼란을 피하기 위해 이를 자체 라우팅 파일에 작성하세요.

그런데 최근 공식 Laravel 프로젝트에서 반례를 보았습니다. Laravel Horizon에서 Taylor는 API 라우팅만 가지고 있지만 별도로 작성하지는 않았지만 여전히 Routes/web.php:

대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법

에 작성했습니다. 또 다른 예는 Laravel이 여전히 매우 개인적이며 Taylor 자신도 그렇지 않다는 것을 증명합니다. 그것을 따르십시오 100% 표준이 제공됩니다.

2.routes/web.php 파일을 그룹화하고 구조화합니다

다음 예도 Laravel 공식 문서에서 가져온 것입니다:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // 使用 first 和 second 中间件
    });
    Route::get('user/profile', function () {
        // 使用 first 和 second 中间件
    });
});
로그인 후 복사

가장 기본적인 사용법은 다양한 미들웨어에 다양한 경로 그룹을 포함하는 것입니다. 예를 들어, 한 그룹은 기본적으로 인증 미들웨어에 의해 제한되고, 다른 그룹은 별도의 관리자 사용자 정의 미들웨어에 의해 제한되는 식입니다.

이런 방식으로 이름, 접두사 등 경로 그룹화 방법을 사용할 수도 있습니다. 다시 한 번 공식 문서에 예가 나와 있습니다.

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // 匹配 URL 「/admin/users」
    });
});
Route::name('admin.')->group(function () {
    Route::get('users', function () {
        // 路由名为 「admin.users」...
    })->name('users');
});
로그인 후 복사

또한 모든 미들웨어 + 이름 + 접두사를 그룹에 추가하려면 배열에 넣어서 이해하기 더 쉽습니다.

// 而不是这样做: 
Route::name('admin.')->prefix('admin')->middleware('admin')->group(function () {
    // ...
});
// 可以使用数组
Route::group([
    'name' => 'admin.', 
    'prefix' => 'admin', 
    'middleware' => 'auth'
], function () {
    // ...
});
로그인 후 복사

결합합니다 A 세 개의 경로 그룹이 있는 실제 예:

/front/XXXXX URL이 있고 미들웨어가 없는 "Guests" 그룹

/user/XXXXXX URL이 있고 인증 미들웨어가 있는 "Users" 그룹

/가 있는 "Admins" 그룹 포함 admin/XXXXX URL 및 사용자 정의 관리자 미들웨어

모든 것을 경로/web.php 파일로 그룹화하는 한 가지 방법은 다음과 같습니다.

Route::group([
    'name' => 'admin.',
    'prefix' => 'admin',
    'middleware' => 'admin'
], function () {
    // URL链接:/admin/users
    // 路由名称:admin.users
    Route::get('users', function () {
        return 'Admin: user list';
    })->name('users');
});
Route::group([
    'name' => 'user.',
    'prefix' => 'user',
    'middleware' => 'auth'
], function () {
    // URL链接:/user/profile
    // 路由名称:user.profile
    Route::get('profile', function () {
        return 'User profile';
    })->name('profile');
});
Route::group([
    'name' => 'front.',
    'prefix' => 'front'
], function () {
    // 这里没有中间件
    // URL链接:/front/about-us
    // 路由名称:front.about
    Route::get('about-us', function () {
        return 'About us page';
    })->name('about');
});
로그인 후 복사

3 컨트롤에 네임스페이스를 사용합니다. 컨트롤러별로 그룹화

위의 예에서는 컨트롤러를 사용하고 예시로 정적 텍스트를 반환했습니다. 컨트롤러를 추가하고 조금 더 멋지게 만들어 보겠습니다. 다음과 같이 서로 다른 네임스페이스의 폴더로 구성하겠습니다.

대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법

그런 다음 경로 파일에서 사용할 수 있습니다.

Route::group([
    'name' => 'front.',
    'prefix' => 'front'
], function () {
    Route::get('about-us', 'Front.boutController@index')->name('about');
});
로그인 후 복사

하지만 이 그룹에 있으면 어떨까요? 컨트롤러가 많나요? Front.omeController를 계속 추가해야 할까요? 물론 그렇지 않습니다. 매개변수 중 하나로 네임스페이스를 전달할 수도 있습니다.

Route::group([
    'name' => 'front.',
    'prefix' => 'front',
    'namespace' => 'Front',
], function () {
    Route::get('about-us', 'AboutController@index')->name('about');
    Route::get('contact', 'ContactController@index')->name('contact');
});
로그인 후 복사

4. 그룹 중첩 그룹

위의 상황은 실제로 3개의 그룹으로 나누어져 있습니다. 실제로는 실제 프로젝트의 구조가 약간 다릅니다. 두 그룹이 있습니다. 그런 다음 인증 내에는 사용자와 관리자라는 두 개의 하위 그룹이 있습니다. 이를 위해, Routes/web.php에 하위 그룹을 생성하고 다양한 미들웨어/접두사 등을 할당할 수 있습니다.

Route::group([
    'middleware' => 'auth',
], function() {
    Route::group([
        'name' => 'admin.',
        'prefix' => 'admin',
        'middleware' => 'admin'
    ], function () {
        // URL: /admin/users
        // Route name: admin.users
        Route::get('users', 'UserController@index')->name('users');
    });
    Route::group([
        'name' => 'user.',
        'prefix' => 'user',
    ], function () {
        // URL: /user/profile
        // Route name: user.profile
        Route::get('profile', 'ProfileController@index')->name('profile');
    });
});
로그인 후 복사

여러 수준의 중첩도 가능합니다. 이는 오픈 소스 프로젝트의 예입니다. Akaunting:

Route::group(['middleware' => 'language'], function () {
    Route::group(['middleware' => 'auth'], function () {
        Route::group(['prefix' => 'uploads'], function () {
            Route::get('{id}', 'Common.ploads@get');
            Route::get('{id}/show', 'Common.ploads@show');
            Route::get('{id}/download', 'Common.ploads@download');
        });
        Route::group(['middleware' => 'permission:read-admin-panel'], function () {
            Route::group(['prefix' => 'wizard'], function () {
                Route::get('/', 'Wizard.ompanies@edit')->name('wizard.index');
        // ...
로그인 후 복사

또 다른 인기 있는 Laravel CRM인 Monica:

Route::middleware(['auth', 'verified', 'mfa'])->group(function () {
    Route::name('dashboard.')->group(function () {
        Route::get('/dashboard', 'DashboardController@index')->name('index');
        Route::get('/dashboard/calls', 'DashboardController@calls');
        Route::get('/dashboard/notes', 'DashboardController@notes');
        Route::get('/dashboard/debts', 'DashboardController@debts');
        Route::get('/dashboard/tasks', 'DashboardController@tasks');
        Route::post('/dashboard/setTab', 'DashboardController@setTab');
    });
로그인 후 복사

5에서 나왔습니다. RouteServiceProvider

모든 라우팅 설정을 제공하는 파일이 있습니다 – app/Providers/RouteServiceProvider.php가 있습니다. 웹과 API라는 두 개의 경로 파일을 바인딩하는 map() 메서드:

    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
    }
    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }
    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }
로그인 후 복사

메서드에 언급된 미들웨어, 네임스페이스 및 접두사를 보셨나요? 여기에서 전체 파일에 대한 전역 구성을 설정할 수 있으므로 파일의 모든 라우팅 그룹에 대해 이러한 설정을 반복할 필요가 없습니다.

설정이 일반적으로 아래와 같기 때문에 API 경로에 주로 사용됩니다.

protected function mapApiRoutes()
{
    Route::group([
        'middleware' => ['api'],
        'namespace' => $this->namespace,
        'prefix' => 'api/v1',
    ], function ($router) {
        require base_path('routes/api.php');
    });
}
로그인 후 복사

위 방법은 모든 API URL 앞에 api/v1/ 접두사를 붙입니다.

6. 더 많은 파일로 그룹화 – 그만한 가치가 있나요?

경로가 많고 이를 별도의 파일로 그룹화하려는 경우 이전 섹션에서 언급한 것과 동일한 파일(app/Providers/RouteServiceProvider.php)을 사용할 수 있습니다. map() 메소드를 자세히 살펴보면 끝에 주석 위치가 표시됩니다.

public function map()
{
    $this->mapApiRoutes();
    $this->mapWebRoutes();
    //
}
로그인 후 복사

원하는 경우 더 많은 파일을 추가하라는 "초대"로 해석할 수 있습니다. 따라서 이 파일 내에 mapAdminRoutes()와 같은 다른 메소드를 만든 다음 이를 map() 메소드에 추가하면 파일이 자동으로 등록되고 로드됩니다.

그러나 개인적으로 저는 이 접근 방식의 이점을 전혀 느끼지 못하고 자주 사용되는 경우도 없습니다. 더 많은 라우팅 분리가 가능하지만 때로는 해당 파일에서 길을 잃고 특정 경로를 어디에서 찾아야 할지 확신할 수 없습니다.

7. Artisan Route:list 명령을 사용하여 특정 경로를 찾으세요.

더 큰 경로와 그곳에서 길을 잃는 경우 특정 경로를 찾는 데 도움이 되는 Artisan 명령이 있습니다.

php artisan Route:list가 프로젝트의 모든 경로를 표시한다는 것을 알고 계실 것입니다.

대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법

하지만 원하는 것을 찾을 수 있는 더 많은 필터링 기능이 있다는 것을 알고 계셨습니까? –method, –name 또는 –path를 인수와 함께 추가하기만 하면 됩니다.

메서드별 필터링 – GET, POST 등:

대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법

이름 또는 URL별 필터링 부분:

대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법

추천 튜토리얼: "Laravel"

위 내용은 대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿