Rumah  >  Artikel  >  rangka kerja php  >  Mari kita bincangkan tentang cara mengatur penghalaan dalam projek Laravel yang besar

Mari kita bincangkan tentang cara mengatur penghalaan dalam projek Laravel yang besar

青灯夜游
青灯夜游ke hadapan
2022-12-14 20:32:261631semak imbas

Mari kita bincangkan tentang cara mengatur penghalaan dalam projek Laravel yang besar

Bayangkan projek Laravel dengan 100+ laluan termasuk modul berasingan untuk tetamu, pengguna, pentadbir dll. Adakah anda benar-benar mahu menulis semuanya dalam satu fail? Jadi bagaimana anda mengumpulkannya dan menambah awalan pada URL? Lihat pilihan yang tersedia.


1. Asingkan penghalaan WEB dan API

Ini mudah kerana Laravel telah melakukannya untuk anda. Terdapat dua fail berikut:

Oleh itu, jika projek anda mempunyai halaman hadapan dan API (senario penggunaan semakin meluas), sila letakkan penghalaan API dalam api.php. [Cadangan berkaitan: tutorial video laravel]

Sebagai contoh, jika anda mempunyai halaman /users dan titik akhir /api/users/ , Tulis mereka secara berasingan dalam fail penghalaan mereka sendiri untuk mengelakkan kekeliruan yang disebabkan oleh nama yang sama muncul dalam fail yang sama.

Tetapi baru-baru ini saya melihat contoh balas daripada projek Laravel rasmi. Dalam Laravel Horizon, Taylor hanya mempunyai laluan API, tetapi dia tidak menulisnya secara berasingan dalam laluan/web.php :

Contoh lain membuktikan bahawa Laravel masih sangat peribadi, malah Taylor sendiri tidak mengikut piawaian 100%.


2. Kumpulkan fail route/web.php ke dalam struktur berstruktur

Contoh berikut juga merupakan contoh daripada dokumentasi rasmi Laravel

:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // 使用 first 和 second 中间件
    });

    Route::get('user/profile', function () {
        // 使用 first 和 second 中间件
    });
});
Penggunaan paling asas adalah untuk memasukkan kumpulan penghalaan yang berbeza dalam perisian tengah yang berbeza. Contohnya, anda mahu satu kumpulan dihadkan oleh

auth middleware secara lalai, kumpulan lain dihadkan oleh admin middleware tersuai yang berasingan, dsb.

Dengan cara ini, anda juga boleh menggunakan kaedah pengumpulan laluan seperti

nama dan awalan. Sekali lagi, contoh diberikan dalam dokumentasi rasmi:

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');
});
Selain itu, jika anda ingin menambah semua perisian tengah + nama + awalan pada kumpulan, lebih mudah difahami dengan meletakkannya dalam tatasusunan:

// 而不是这样做: 
Route::name('admin.')->prefix('admin')->middleware('admin')->group(function () {
    // ...
});

// 可以使用数组
Route::group([
    'name' => 'admin.', 
    'prefix' => 'admin', 
    'middleware' => 'auth'
], function () {
    // ...
});
Kami menggabungkan ini menjadi contoh sebenar dengan tiga kumpulan laluan:

    dengan URL
  • /depan/XXXX dan tiada kumpulan "Tetamu" middleware
  • dengan
  • / pengguna/XXXXX URL dan auth kumpulan "Pengguna" middleware
  • dengan
  • / admin / 🎜> Kaedah dalam fail:
  • 3. Pengawal kumpulan menggunakan ruang nama

Dalam contoh di atas, kami Tiada pengawal digunakan, hanya teks statik dikembalikan sebagai contoh. Mari tambahkan pengawal dan dapatkan sedikit gaya — kami akan menstrukturkannya ke dalam folder dalam ruang nama mereka sendiri yang berbeza, seperti ini:

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

});

Kemudian kita boleh Gunakannya dalam penghalaan fail:

Tetapi bagaimana jika dalam kumpulan ini kita mempunyai banyak pengawal? Sudah tentu tidak. Anda juga boleh melepasi ruang nama sebagai salah satu parameter.

4 Kumpulan bersarang

Route::group([
    'name' => 'front.',
    'prefix' => 'front'
], function () {
    Route::get('about-us', 'Front.boutController@index')->name('about');
});
Situasi di atas terbahagi kepada 3 kumpulan Sebenarnya, ini dipermudahkan sedikit berbeza – ​​terdapat

dua kumpulan: depan

dan
Route::group([
    'name' => 'front.',
    'prefix' => 'front',
    'namespace' => 'Front',
], function () {
    Route::get('about-us', 'AboutController@index')->name('about');
    Route::get('contact', 'ContactController@index')->name('contact');
});
auth
. Kemudian dalam

auth, terdapat dua subkumpulan: pengguna

dan

admin . Untuk melakukan ini, kita boleh mencipta subkumpulan dalam laluan/web.php dan menetapkan perisian tengah/ awalan yang berbeza dsb. Kita juga boleh mempunyai pelbagai peringkat sarang, yang merupakan contoh projek sumber terbuka. Akaunting:Contoh lain datang daripada CRM Laravel popular lain yang dipanggil Monica:

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

    });

});

5 . Tetapan global dalam RouteServiceProvider

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

        // ...
Terdapat fail yang menyediakan semua tetapan laluan –

app/Providers/RouteServiceProvider.php Ia mempunyai keupayaan untuk mengikat dua laluan Dokumentasi – map()

kaedah untuk web dan API:
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');
    });
    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

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

Atas ialah kandungan terperinci Mari kita bincangkan tentang cara mengatur penghalaan dalam projek Laravel yang besar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam