我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何在大型Laravel项目中组织路由

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何在大型Laravel项目中组织路由

这篇文章主要讲解了“如何在大型Laravel项目中组织路由”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在大型Laravel项目中组织路由”吧!

1. 分离 WEB 和 API 路由

这个简单,因为 Laravel 已经帮你做了。有如下两个文件:

  • routes/web.php

  • routes/api.php

因此,如果你的项目同时具有前端页面和 API (使用场景越来越广),请把 API 的路由放在 api.php 里。例如,如果你有 /users 页面,又有 /api/users/ 端点,把他们分别写在自己属于自己路由文件里,以免在同一文件中出现同一相同名称而产生混淆。

另一个例子证明 Laravel 还是非常的个人化,甚至 Taylor 自己也没有 100% 按照标准来。

2. 把 routes/web.php 文件分组结构化

下面例子也是来自 Laravel 官方文档 的示例:

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

最基本的用法是将不同的路由分组包含在不同的中间件里面。例如,你希望一个组默认受 auth 中间件限制,另一组受单独的  admin 自定义中间件限制等。

这样,你还可以使用 名称前缀 等路由分组方法。同样,官方文档中给出了示例:

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 () {    // ...});

我们将其结合为一个拥有三个路由分组的真实示例:

  • 带有 / front / XXXXX URL 且没有中间件的「访客」组

  • 带有 / user / XXXXX URL 和 auth 中间件的「用户」组

  • 带有 / admin / XXXXX URL 和自定义 admin 中间件的「管理员」组

以下是将所有内容分组到 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');});

3. 使用命名空间对控制器进行分组

在上面的例子中,我们没有使用控制器,只是返回了静态文本作为示例。 让我们添加一个控制器,来点小花样 — 我们会将它们构造到各自不同的命名空间的文件夹中

然后我们可以在路由文件中使用它们:

Route::group([    'name' => 'front.',    'prefix' => 'front'], function () {    Route::get('about-us', 'Front.boutController@index')->name('about');});

但是如果在这个组中我们有很多控制器呢? 我们应该一直添加Front.omeController 吗? 当然不是。您也可以将命名空间作为参数之一。

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. 组嵌套组

上面的情况,分为了3个组,实际上这是被简化的, 实际项目的结构稍有不同 – 是 个组:frontauth 。 然后在 auth 中,有两个子组:useradmin 。为此, 我们可以在 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,名为Monica:

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

5. RouteServiceProvider 中的全局设置

有一个服务于所有路由设置的文件 – app/Providers/RouteServiceProvider.php. 它具有绑定两个路由文件 – web 和 API 的 map() 方法:

    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 部分过滤

感谢各位的阅读,以上就是“如何在大型Laravel项目中组织路由”的内容了,经过本文的学习后,相信大家对如何在大型Laravel项目中组织路由这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何在大型Laravel项目中组织路由

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在大型Laravel项目中组织路由

这篇文章主要讲解了“如何在大型Laravel项目中组织路由”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在大型Laravel项目中组织路由”吧!1. 分离 WEB 和 API 路由这个简
2023-07-04

react项目中如何使用插件配置路由

本篇内容介绍了“react项目中如何使用插件配置路由”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!react路由中没有安全守卫推荐使用插件完
2023-07-05

GitLab中如何将项目转移至另一个组织

在软件项目开发中,GitLab是一个非常流行的版本控制平台。它带来了许多便利和方便的功能,包括源代码托管、合并请求、CI/CD流水线等等。然而,在项目变更或组织结构调整中,有时候需要将GitLab中的项目转移至另一个组织。本文将介绍如何将G
2023-10-22

如何在Go语言中实现路由分组

Go语言是一种简洁高效的编程语言,在Web开发领域也有广泛的应用。在Web开发中,路由是必不可少的部分。而路由分组则是一个更加高级的路由功能,它可以使代码更加清晰、简洁,提高代码可读性和可维护性。本文将从原理和代码实现两个方面,详细介绍如何
如何在Go语言中实现路由分组
2023-12-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录