请问对于 Laravel 要模块化的问题,有没有什么好的解决方案

2019-12-13 16:48:00 +08:00
 lijialong1313
我们采用的是 Laravel 5.5。

随着我们的迭代,laravel5.5 文件数量逐渐的增加,我们维护起来比较麻烦,于是考虑到按模块分化的想法。

我们原本的设计分包基本上参考原生 laravel 的设计。

app 目录下分为:
Console 文件夹存放命令
Events/Listener 存放事件触发
Exception 存放错误处理
Http\Controllers 存放控制类
Models 存放一些和数据库连接的模型
Services 存放一些和界面无关的数据处理

这是我们原本的应用设计,但是因为每次更新部分功能都要提交整个 PR,就经常出现冲突问题。

我想问的是有没有什么比较好的解决方案,能将 laravel 中,不同功能之间可以彼此独立进行更新,例如全部放到同一个文件夹里,同时不改变命名空间、不适用 vendor 的方式的建议。

我们个人讨论出来是有两种方案
一种是建立一个类似于 Modules 的文件夹,然后整个就变成了:

Modules\应用名\*

然后通过编写类似 autoload.php 的文件进行挂载。modules 之间就可以进行版本管理

这种方法能保障同步更新,但是没办法分离 web.php 里面的文件(就是 routes 文件夹里)

另一种是将整个 laravel 里面分为每个模块,然后每次更新后将文件复制过去。

比如如果有一个是
app\Http\Controllers\TestController
这个又恰好叫 User
然后就会分离成:
app\Http\Controllers\Test\TestController

这种方式显而易见的要修改很多代码,而且不基于这个修改版根本无法运行,意思是没办法自己进行测试。

我想问一下各位大佬用什么方式比较好,我们的需求(优先级依次递减)
1.方便管理各模块的代码更新
2.尽可能将大的代码文件例如 routes/web.php 文件拆开
3.尽可能减少对“模块”代码的修改,就是尽可能原始 laravel 也可以正常运行。
4415 次点击
所在节点    PHP
8 条回复
avenger
2019-12-14 09:21:18 +08:00
参考官方 package 模式开发不好吗?
zhyt0520
2019-12-14 15:58:55 +08:00
我也想知道
TeslaLyon
2019-12-20 11:54:42 +08:00
@avenger 老哥,求多指点指点,没有找到相关文档。。
avenger
2019-12-20 15:20:35 +08:00
TeslaLyon
2019-12-20 16:47:07 +08:00
@avenger 谢谢
lijialong1313
2019-12-20 17:20:09 +08:00
@avenger 按照 laravel 这里说的应该是和 vendor 的开发吧,但是要怎么解决 app 里面文件的问题这里没有说啊。你的意思是不是:
route 这类采用 laravel 的挂载,自己写一个 provider 然后添加到 kenerel 里
app 的话修改 composer 文件让其挂在其他目录为 app 目录
avenger
2019-12-20 17:55:23 +08:00
@lijialong1313 既然要模块化,就要把可以独立的包抽象出来,可以有自己的 Route,自己的 provider,再通过 autoload 注入 App,可以参考一下官方的包是怎么写的,例如 Horizon、Telescope 这些。
lijialong1313
2019-12-26 09:39:40 +08:00
@avenger 我研究了一下 autoload,但是我们手上这个需要模块化的项目,各方面是强相关的,不是特别适合于抽象。

比如我们有一个推送模块,它分为了管理界面->推送底层实现->推送界面三个部分,我们的模块化就将这三个部分给独立开来了。

我现在遇到的问题是,随着这种“模块”的增多,整个项目需要管理起来就会变得特别庞大。问题主要是,比如推送模块是有权限设置的,那它也需要数据库,需要自己的表,自己的路由,自己的界面,但是这个”自己的界面“会基于这个项目的底层(比如 resouces/views/main.blade.php )再显示。这里面就比较复杂,要处理起来也比较麻烦。

我希望的就是能不能有一些解决方案能类似 composer 一样,但是不使用 vendors 文件夹。
有关 laravel 和 composer 我看过文档,问题主要在 composer 和 laravel 给的比较固定死,比如路由固定死了要用这个方法挂载,但是挂载之后,我希望对部分模块进行中间件的拦截(比如推送系统需要嵌套微信登录,微信登陆用 overtrue 的,而且这个中间件基于它的还有二次修改),这时候似乎 laravel 和 composer 都比较有心无力。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/628799

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX