模块化尝试——基于 Module 的 Laravel API 结构

主要参考:基于 Module 的 Laravel API 架构

前言

又是一篇讨论目录结构的口水文章(笔记额。。。

项目中有多个模块是很常有的事,可能大多数小伙伴会在laravel原本的app下的ControllersModelsObserversJobs、.....目录下分别新建多个模块目录。可是这样当项目变得庞大,将会很难维护。如果使用模块化设计,相当于多个模块公用一套laravel底层代码,会清晰许多,有的模块简单(结构也简单),有的模块复杂(结构也复杂),迭代也容易许多(你可以老模块用旧标准、新模块用新标准),升级也会容易许多(如果你需要从低版本升到高版本,又只需要其中一部分模块,你可以把旧版本你需要的几个模块的代码提出来放到新版本中)。

上图,模块化的 目录结构 以及 命名空间namespace类引用use大概是这样
模块化设计

app目录保留,只放一些必须公用的东西,比如异常处理、中间件、Providers,越简单越好。
当然不同模块,你想自定义单独模块异常处理和中间件都很方便。

以下是我的笔记:

step 0. 肯定是先建立module目录,新建两个模块以及各自模块的路由文件。
step 1. 修改 app/RouteServiceProvider.php 中的 mapApiRoutes() 方法,给它新增一个指向 routes/modules.php 的路由组。

  protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
        //以下为新增
        Route::middleware('api')
             ->group(base_path('routes/modules.php'));
    }

step 2. 修改 composer.json , 具体是autoloadpsr-4字段 ,给它新增你需要的项目模块psr-4的自动加载,(找"App\\": "app/",加在它下面~

 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/",
            "Blog\\": "modules/Blog",      //新增
            "Shop\\": "modules/shop"     //新增
        },
        "files": [
            "bootstrap/helpers.php"
        ]
    },

这里,其实是可以建立和app平级的目录,可是,假如你有20+模块,这就很可怕了,还是放在modules里好一点.

别忘了执行 composer dump-autoload

setp 3. 新增routes/modules.php , 添加指向所需模块(这里是Blog和Shop)的路由组。

<?php
Route::prefix('blog')
    ->namespace('Blog\Http\Controllers')
    ->group(base_path('modules/Blog/routes.php'));

Route::prefix('shop')
    ->namespace('Shop\Http\Controllers')
    ->group(base_path('modules/Shop/routes.php'));

step 4. 修改模块下Controller、Model等目录的命名空间和引用。(如果是新模块,直接新建咯
namespace App\Http\Controllers\Blog;namespace Blog\Http\Controllers;
use App\Models\Blog\Topic;use Blog\Models\Topic;

step 5. 测试.postman跑接口,都是ok哒。

后记

还没解决的问题:migrations文件怎样更改目录? 好像是只能放到database/migrations下面。
其他todo:新增Module相关的artisan命令。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9
Mumujin

直接使用laravel 扩展包更为方便管理moduler

5年前 评论

@Olivia-outshine 自己折腾主要是为了学习啦。而且个人不是很喜欢太多的扩展包,这个扩展包功能很多,但是我可能需要的并不多。

5年前 评论

migrate 可以指定路径

file

5年前 评论

楼主PHPstorm用的什么主题?

5年前 评论
黑将军

@messikiller Material Theme UI插件吧

5年前 评论

@messikiller
@黑将军
对哒,Material Theme UI插件,具体是Material Oceanic这个主题

5年前 评论

做大项目的话, laravel module模式会对性能有影响吗, 毕竟不是官方的产品

4年前 评论
nosun

@xzf_laravel 本质上只是重新规划了目录,以及做了很多命令来配合各种操作,性能应该没问题,不过我也是刚开始尝试使用。

4年前 评论
xzf_laravel 4年前
ZeroAndOne 3年前
Zbin 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
php @ abc
文章
20
粉丝
94
喜欢
197
收藏
231
排名:107
访问:8.9 万
私信
所有博文
社区赞助商