대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법에 대해 이야기해 보겠습니다.

青灯夜游
풀어 주다: 2022-12-15 21:28:14
앞으로
1703명이 탐색했습니다.

대규모 Laravel 프로젝트에서 라우팅을 구성하는 방법에 대해 이야기해 보겠습니다.

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


1. WEB 및 API 라우팅 분리

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

그래서 프로젝트에 프런트 엔드 페이지와 API가 모두 있는 경우(사용 시나리오가 점점 더 넓어지고 더 넓은 경우) API 경로를 api.php에 넣어주세요. [관련 권장 사항: laravel 비디오 튜토리얼]

예를 들어 /users 페이지와 /api/users/ 엔드포인트가 있는 경우 동일한 파일에 있지 않도록 각각의 라우팅 파일에 별도로 작성하세요. 동일한 이름이 존재하기 때문에 혼란이 발생합니다.

하지만 최근에 official Laravel 프로젝트에서 반례를 보았습니다. Laravel Horizon에서 Taylor API 경로만 가지고 있지만 별도로 작성하지는 않았지만 여전히 routes/web.php에 작성했습니다.

또 다른 예는 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 中间件
    });
});
로그인 후 복사

가장 기본적인 사용법은 다른 미들웨어에 다른 경로 그룹을 포함하는 것입니다. . 예를 들어, 한 그룹은 기본적으로 auth 미들웨어로 제한하고, 다른 그룹은 별도의 admin 사용자 정의 미들웨어로 제한하는 등의 작업을 수행합니다.

이런 방식으로 nameprefix과 같은 라우팅 그룹화 방법을 사용할 수도 있습니다. 다시 한 번 공식 문서에 예가 나와 있습니다.

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/XXXXX URL 및 auth 미들웨어 "Users" 그룹
  • "Admin" /admin/XXXXX URL 및 사용자 정의 admin 미들웨어

여기에서 모든 것을 routes/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 네임스페이스를 사용하여 컨트롤러를 그룹화합니다. 위의 예에서는 컨트롤러를 사용하지 않고 예시로 정적 텍스트만 반환했습니다. 컨트롤러를 추가하고 조금 더 멋지게 만들어 보겠습니다. 다음과 같이 서로 다른 네임스페이스의 폴더로 구성하겠습니다.

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

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

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

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개의 그룹으로 나누어져 있습니다. 실제로는 실제 프로젝트의 구조가 약간 다릅니다.

두 개의 그룹이 있습니다.

인증

. 그런 다음 auth 내에는 useradmin이라는 두 개의 하위 그룹이 있습니다. 이를 위해 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

:

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'));
    }
로그인 후 복사

您是否注意到方法中提及的 middleware, namespaceprefix ? 这是您可以为整个文件设置全局配置的地方,因此不必为文件中的每个路由组重复这些设置。

它主要用于 API 路由,因为它们的设置通常是相同的,如下所示:

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

上述方法将在所有 API URLs 的开头加上 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 将展示项目中的所有路由

但您知道还有更多的过滤功能来找到您想要的东西吗? 只需添加带参数的 –method,–name,–path

通过 method 过滤 – GET, POST 等:

按名称或 URL 部分过滤:


这就是我所能告诉的关于在大型项目中分组路由的全部内容。你还有其他例子吗?请在评论中分享。

原文地址:https://laraveldaily.com/how-to-structure-routes-in-large-laravel-projects/

译文地址:https://learnku.com/laravel/t/38917

更多编程相关知识,请访问:编程视频!!

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

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