Rumah >rangka kerja php >Laravel >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.
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):
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');
… Anda mungkin hanya mempunyai satu baris:
Route::resource('books', BookController::class);
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);
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']);
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 }); });
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 () { // ... 管理员路由 });
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' ], ];
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 });
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']); });
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;
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;
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']); });
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']); // ... 来自用户命名空间的其他控制器 });
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')); }); }
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')); });
如果你不想深入研究 服务提供者,还有一种更简单的方法 - 只需 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';
如果你的 Controller 中有一些方法,但它们不遵循标准的 Resource 结构,您仍然可以对它们进行分组,而无需为每个方法重复 Controller 名称。
取而代之的是:
Route::get('profile', [ProfileController::class, 'getProfile']); Route::put('profile', [ProfileController::class, 'updateProfile']); Route::delete('profile', [ProfileController::class, 'deleteProfile']);
您可以这样做:
Route::controller(ProfileController::class)->group(function() { Route::get('profile', 'getProfile'); Route::put('profile', 'updateProfile'); Route::delete('profile', 'deleteProfile'); });
此功能在 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!