게스트, 사용자, 관리자 등을 위한 별도의 모듈을 포함하여 100개 이상의 경로가 있는 Laravel 프로젝트를 상상해 보세요. 정말로 모든 것을 하나의 파일에 쓰고 싶습니까? 그렇다면 이들을 그룹화하고 URL에 접두어를 추가하려면 어떻게 해야 할까요? 어떤 옵션을 사용할 수 있는지 확인하세요.
Laravel이 이미 이를 수행했기 때문에 이는 간단합니다. 다음 두 파일이 있습니다:
그래서 프로젝트에 프런트 엔드 페이지와 API가 모두 있는 경우(사용 시나리오가 점점 더 넓어지고 더 넓은 경우) API 경로를 api.php에 넣어주세요. [관련 권장 사항: laravel 비디오 튜토리얼]
예를 들어 /users 페이지와 /api/users/ 엔드포인트가 있는 경우 동일한 파일에 있지 않도록 각각의 라우팅 파일에 별도로 작성하세요. 동일한 이름이 존재하기 때문에 혼란이 발생합니다.
하지만 최근에 official Laravel 프로젝트에서 반례를 보았습니다. Laravel Horizon에서 Taylor 는 API 경로만 가지고 있지만 별도로 작성하지는 않았지만 여전히 routes/web.php에 작성했습니다.
또 다른 예는 Laravel이 여전히 매우 개인적이라는 것을 증명합니다. Taylor조차도 표준을 100% 따르지는 않았습니다.
다음 예는 Laravel 공식 문서의 예이기도 합니다.
Route::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // 使用 first 和 second 中间件 }); Route::get('user/profile', function () { // 使用 first 和 second 中间件 }); });
가장 기본적인 사용법은 다른 미들웨어에 다른 경로 그룹을 포함하는 것입니다. . 예를 들어, 한 그룹은 기본적으로 auth 미들웨어로 제한하고, 다른 그룹은 별도의 admin 사용자 정의 미들웨어로 제한하는 등의 작업을 수행합니다.
이런 방식으로 name 및 prefix과 같은 라우팅 그룹화 방법을 사용할 수도 있습니다. 다시 한 번 공식 문서에 예가 나와 있습니다.
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 세 가지 경로 그룹이 있는 실제 예:
여기에서 모든 것을 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'); });
그런 다음 경로 파일에서 사용할 수 있습니다.
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. 그룹 중첩 그룹
. 그런 다음 auth 내에는 user 및 admin이라는 두 개의 하위 그룹이 있습니다. 이를 위해 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인
5에서 가져온 것입니다. RouteServiceProvider의 전역 설정
모든 라우팅 설정을 제공하는 파일이 있습니다 –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, namespace 和 prefix ? 这是您可以为整个文件设置全局配置的地方,因此不必为文件中的每个路由组重复这些设置。
它主要用于 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/ 前缀。
如果您有大量的路由,并且希望将它们分组到单独的文件中,那么您可以使用上一节中提到的相同文件 – app/Providers/RouteServiceProvider.php。如果您仔细查看它的 map() 方法,您将在末尾看到注释位置:
public function map(){ $this->mapApiRoutes(); $this->mapWebRoutes(); //}
如果愿意,您可以将其解释为添加更多文件的“邀请”。因此,您可以在此文件内创建另一个方法,例如 mapAdminRoutes(),然后将其添加到 map() 方法, 您的文件将被自动注册并加载。
但是,就我个人而言,我看不出这种方法有什么优势,而且我也没有经常看到这种做法。它会带来更多的路由分离,但有时您会迷失在那些文件中,不确定在哪里查找特定的路由。
说到更大的路由并迷失在那里,我们有一个 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!