您好,欢迎访问一九零五行业门户网

Laravel如何进行路由分组?6 种路由组织技术分享

laravel 路由是开发人员从一开始就学习的特性。但是随着他们项目的增长,管理不断增长的路由文件变得越来越困难,经常需要滚动查找正确的 route::get() 语句。幸运的是,有一些技术可以使路由文件更短、更易读,让我们来看看以不同的方式对路由及其设置进行分组。
我们不会只谈论一般简单的 route::group(),那是初学者级别。 让我们再深入一点。
分组 1. route::resource 和 route::apiresource让我们从房间里的大象开始:这可能是最常用的分组。如果您围绕一个模型有一组典型的 crud 操作,则应该将它们分组到 资源控制器
此类控制器包含 多达 7 种方法(但可能更少):
index()create()store()show()edit()update()destroy()因此,如果您的路由集对应于这些方法,请不要使用:
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');
… 您可能只有一行:
route::resource('books', bookcontroller::class);
如果您使用 api 项目,则不需要用于创建 / 编辑的可视化表单,因此您可以使用 apiresource() 的涵盖 7 种方法中的 5 种不同语法:
route::apiresource('books', bookcontroller::class);
此外,我建议您考虑资源控制器,即使您有 2-4 个方法,而不是完整的 7 个。只是因为它保持标准命名约定 - 对于 url、方法和路由名称。 例如,在这种情况下,您不需要手动提供名称:
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']);
分组 2. 嵌套子路由组当然,一般的 路由分组 大家都知道。 但对于更复杂的项目,一级分组可能还不够。
实际示例:您希望授权路由与 auth 中间件进行分组,但在内部您需要分隔更多子组,例如管理员和简单用户。
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 });});
分组 3. 将重复的中间件分组如果你有很多中间件,有一些在路由组中重复出现怎么办?
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 () { // ... 管理员路由});
如您所见,有 5 个中间件,其中 4 个是重复的。因此,在 app/http/kernel.php 文件里,我们可以将这 4 个移动到单独的中间件组中:
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' ],];
所以将我们的中间件组命明为 check_user,现在我们可以缩写路由:
route::prefix('students')->middleware(['check_user', 'check.invoice.status'])->group(function () { // ... student routes});route::prefix('managers')->middleware(['check_user'])->group(function () { // ... manager routes});
分组 4. 同名控制器,不同命名空间很常见的情况是,例如,为不同的用户角色设置了 homecontroller,例如 admin/homecontroller 和 user/homecontroller。 如果在路由中使用完整路径,它看起来像这样:
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']);});
每个控制器都是用了完整的路径这看上去很冗余,对吧? 这就是为什么许多开发人员更喜欢在路由列表中只包含 homecontroller::class 并在顶部添加类似这样的内容:
use app\http\controllers\admin\homecontroller;
但是这里的问题是我们有相同的控制器类名! 所以,这行不通:
use app\http\controllers\admin\homecontroller;use app\http\controllers\user\homecontroller;
哪一个是「管理后台」的控制器?好吧,一种方法是更改名称并为其中之一分配别名:
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']);});
但是,就个人而言,更改顶部类的名称让我很困惑,我喜欢另一种方法:为控制器的子文件夹添加一个命名空间():
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']); // ... 来自用户命名空间的其他控制器});
分组 5. 分离路由文件如果你觉得 routes/web.php 或 routes/api.php 太大了,可以把一些路由放到一个单独的文件中,你可以为它任意命名,例如 routes/admin.php。
要加载该文件,有两种方法:我称之为 「laravel 方式」 和 「php 方式」 。
如果你想遵循 laravel 构建其默认路由文件的结构,查看 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 和 routes/web.php 都在这里,但设置略有不同。因此,你只需要在此处添加 admin 文件:
$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';
分组 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']);
您可以这样做:
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视频教程】
以上就是laravel如何进行路由分组?6 种路由组织技术分享的详细内容。
其它类似信息

推荐信息