Rumah > rangka kerja php > Laravel > Bagaimanakah Laravel melaksanakan kumpulan penghalaan? Perkongsian 6 teknologi organisasi penghalaan

Bagaimanakah Laravel melaksanakan kumpulan penghalaan? Perkongsian 6 teknologi organisasi penghalaan

青灯夜游
Lepaskan: 2022-10-11 19:58:55
ke hadapan
2131 orang telah melayarinya

Bagaimanakah Laravel melaksanakan kumpulan penghalaan? Perkongsian 6 teknologi organisasi penghalaan

Penghalaan Laravel ialah ciri yang dipelajari oleh pembangun dari awal. Tetapi apabila projek mereka berkembang, ia menjadi semakin sukar untuk mengurus fail penghalaan yang semakin meningkat, selalunya memerlukan penatalan untuk mencari pernyataan Route::get() yang betul. Nasib baik, terdapat beberapa teknik untuk menjadikan fail laluan lebih pendek dan lebih mudah dibaca, mari lihat cara berbeza untuk mengumpulkan laluan dan tetapannya.

Kami tidak akan bercakap tentang perkara mudah biasa Route::group(), itu tahap pemula. Mari kita gali lebih dalam.


Kumpulan 1. Laluan::sumber dan Laluan::apiResource

Mari kita mulakan dengan gajah di dalam bilik: ini mungkin kumpulan yang paling biasa digunakan . Jika anda mempunyai set biasa operasi CRUD di sekeliling model, anda harus mengumpulkannya ke dalam Pengawal Sumber

Pengawal sedemikian mengandungi sehingga 7 kaedah ( tetapi mungkin kurang):

  • index()
  • create()
  • store()
  • show()
  • edit( )
  • kemas kini()
  • musnahkan()

Jadi jika set laluan anda sepadan dengan kaedah ini, jangan gunakan:

Route::get('books', [BookController::class, 'index'])->name('books.index');
Route::get('books/create', [BookController::class, 'create'])->name('books.create');
Route::post('books', [BookController::class, 'store'])->name('books.store');
Route::get('books/{book}', [BookController::class, 'show'])->name('books.show');
Route::get('books/{book}/edit', [BookController::class, 'edit'])->name('books.edit');
Route::put('books/{book}', [BookController::class, 'update'])->name('books.update');
Route::delete('books/{book}', [BookController::class, 'destroy'])->name('books.destroy');
Salin selepas log masuk

… Anda mungkin hanya mempunyai satu baris:

Route::resource('books', BookController::class);
Salin selepas log masuk

Jika anda menggunakan projek API, anda tidak memerlukan borang visual untuk mencipta/mengedit , jadi anda boleh menggunakan 5 sintaks berbeza apiResource() meliputi 7 kaedah:

Route::apiResource('books', BookController::class);
Salin selepas log masuk

Selain itu, saya mengesyorkan anda mempertimbangkan pengawal sumber, walaupun anda mempunyai 2- 4 kaedah sebaliknya daripada 7 penuh. Semata-mata kerana ia mengekalkan konvensyen penamaan standard - untuk URL, kaedah dan nama laluan. Contohnya, dalam kes ini, anda tidak perlu memberikan nama secara manual:

Route::get('books/create', [BookController::class, 'create'])->name('books.create');
Route::post('books', [BookController::class, 'store'])->name('books.store');

// 相反,这里的名称“books.create”和“books.store”是自动分配的
Route::resource('books', BookController::class)->only(['create', 'store']);
Salin selepas log masuk

Kumpulan 2. Kumpulan sub-laluan bersarang

Sudah tentu, perkumpulan laluan umum diketahui oleh semua orang. Tetapi untuk projek yang lebih kompleks, satu tahap pengelompokan mungkin tidak mencukupi.

Contoh praktikal: Anda mahu penghalaan keizinan dikumpulkan dengan auth perisian tengah, tetapi secara dalaman anda perlu mengasingkan lebih banyak subkumpulan, seperti pentadbir dan pengguna mudah.

Route::middleware('auth')->group(function() {

    Route::middleware('is_admin')->prefix('admin')->group(function() {
     Route::get(...) // administrator routes
    });

    Route::middleware('is_user')->prefix('user')->group(function() {
     Route::get(...) // user routes
    });
});
Salin selepas log masuk

Kumpulan 3. Kumpulan duplikat middleware

Jika anda mempunyai banyak middleware, sesetengahnya sedang dalam penghalaan Apa yang sepatutnya Saya lakukan jika ia muncul berulang kali dalam kumpulan?

Route::prefix('students')->middleware(['auth', 'check.role', 'check.user.status', 'check.invoice.status', 'locale'])->group(function () {
    // ... 学生路由
});

Route::prefix('managers')->middleware(['auth', 'check.role', 'check.user.status', 'locale'])->group(function () {
    // ... 管理员路由
});
Salin selepas log masuk

Seperti yang anda lihat, terdapat 5 middleware, 4 daripadanya adalah pendua. Oleh itu, dalam fail app/Http/Kernel.php, kita boleh mengalihkan 4 ini ke dalam kumpulan middleware yang berasingan:

protected $middlewareGroups = [
    // 此组是 Laravel 默认中间件组
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    // 此组是 Laravel 默认中间件组
    'api' => [
        // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    // 这是我们新的中间件组
    'check_user' => [
        'auth',
        'check.role',
        'check.user.status',
        'locale'
    ],
];
Salin selepas log masuk

Jadi namakan kumpulan middleware kami check_user, sekarang kita boleh menyingkatkan laluan:

Route::prefix('students')->middleware(['check_user', 'check.invoice.status'])->group(function () {
    // ... student routes
});

Route::prefix('managers')->middleware(['check_user'])->group(function () {
    // ... manager routes
});
Salin selepas log masuk

Kumpulan 4. Pengawal dengan nama yang sama, ruang nama yang berbeza

adalah sangat Kes biasa, contohnya , HomeController ditetapkan untuk peranan pengguna yang berbeza, seperti Admin/HomeController dan User/HomeController. Jika anda menggunakan laluan penuh dalam laluan, ia kelihatan seperti ini:

Route::prefix('admin')->middleware('is_admin')->group(function () {
    Route::get('home', [\App\Http\Controllers\Admin\HomeController::class, 'index']);
});

Route::prefix('user')->middleware('is_user')->group(function () {
    Route::get('home', [\App\Http\Controllers\User\HomeController::class, 'index']);
});
Salin selepas log masuk

Laluan penuh digunakan untuk setiap pengawal Ini kelihatan berlebihan, bukan? Itulah sebabnya ramai pembangun memilih untuk mempunyai HomeController::class sahaja dalam senarai laluan dan menambah sesuatu seperti ini di bahagian atas:

use App\Http\Controllers\Admin\HomeController;
Salin selepas log masuk

Tetapi masalahnya di sini ialah kami mempunyai Pengawal yang sama nama kelas! Jadi, ini tidak berfungsi:

use App\Http\Controllers\Admin\HomeController;
use App\Http\Controllers\User\HomeController;
Salin selepas log masuk

Yang manakah pengawal "admin backend"? Nah, satu cara ialah menukar nama dan menetapkan alias kepada salah satu daripada mereka:

use App\Http\Controllers\Admin\HomeController as AdminHomeController;
use App\Http\Controllers\User\HomeController;

Route::prefix('admin')->middleware('is_admin')->group(function () {
    Route::get('home', [AdminHomeController::class, 'index']);
});

Route::prefix('user')->middleware('is_user')->group(function () {
    Route::get('home', [HomeController::class, 'index']);
});
Salin selepas log masuk

Namun, secara peribadi, menukar nama kelas teratas mengelirukan saya, Saya Suka yang lain pendekatan: tambah ruang nama() untuk subfolder pengawal:

Route::prefix('admin')->namespace('App\Http\Controllers\Admin')->middleware('is_admin')->group(function () {
    Route::get('home', [HomeController::class, 'index']);
    // ... Admin 命名空间中的其他控制器
});

Route::prefix('user')->namespace('App\Http\Controllers\User')->middleware('is_user')->group(function () {
    Route::get('home', [HomeController::class, 'index']);
    // ... 来自用户命名空间的其他控制器
});
Salin selepas log masuk

kumpulan 5. Asingkan fail penghalaan

Jika anda merasakan bahawa routes/web.php atau routes/api.php terlalu besar, anda boleh meletakkan beberapa laluan ke dalam fail yang berasingan Anda boleh menamakannya apa sahaja yang anda mahu, seperti routes/admin.php.

Untuk memuatkan fail ini, terdapat dua cara: Saya memanggilnya "cara Laravel" dan "cara PHP".

Jika anda ingin mengikuti struktur cara Laravel membina fail laluan lalainya, lihat app/Providers/RouteServiceProvider.php:

public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        Route::middleware('api')
            ->prefix('api')
            ->group(base_path('routes/api.php'));

        Route::middleware('web')
            ->group(base_path('routes/web.php'));
    });
}
Salin selepas log masuk

routes/api.php dan routes/web.php kedua-duanya ada di sini, tetapi dengan tetapan yang sedikit berbeza. Jadi anda hanya perlu menambah fail pentadbir di sini:

$this->routes(function () {
    Route::middleware('api')
        ->prefix('api')
        ->group(base_path('routes/api.php'));

    Route::middleware('web')
        ->group(base_path('routes/web.php'));

    Route::middleware('is_admin')
        ->group(base_path('routes/admin.php'));
});
Salin selepas log masuk

如果你不想深入研究 服务提供者,还有一种更简单的方法 - 只需 include/require 您的路由文件到另一个文件中,就像你在 Laravel 框架之外的任何 PHP 文件。

事实上,这是由 Taylor Otwell 完成的,只需将 routes/auth.php 文件直接放入 Laravel Breeze 路由

routes/web.php:

Route::get('/', function () {
    return view('welcome');
});

Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth'])->name('dashboard');

require __DIR__.'/auth.php';
Salin selepas log masuk

分组 6. Laravel 9 中的新功能: Route::controller ()

如果你的 Controller 中有一些方法,但它们不遵循标准的 Resource 结构,您仍然可以对它们进行分组,而无需为每个方法重复 Controller 名称。

取而代之的是:

Route::get('profile', [ProfileController::class, 'getProfile']);
Route::put('profile', [ProfileController::class, 'updateProfile']);
Route::delete('profile', [ProfileController::class, 'deleteProfile']);
Salin selepas log masuk

您可以这样做:

Route::controller(ProfileController::class)->group(function() {
    Route::get('profile', 'getProfile');
    Route::put('profile', 'updateProfile');
    Route::delete('profile', 'deleteProfile');
});
Salin selepas log masuk

此功能在 Laravel 9 和 Laravel 8 的最新小版本中可用。


就是这样,这些分组技术有望帮助你组织和维护的路由,无论你的项目发展到多大。

原文地址:https://laravel-news.com/laravel-route-organization-tips

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

【相关推荐:laravel视频教程

Atas ialah kandungan terperinci Bagaimanakah Laravel melaksanakan kumpulan penghalaan? Perkongsian 6 teknologi organisasi penghalaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan