V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lijialong1313
V2EX  ›  PHP

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

  •  
  •   lijialong1313 · 2019-12-13 16:48:00 +08:00 · 4402 次点击
    这是一个创建于 1589 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们采用的是 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 也可以正常运行。
    8 条回复    2019-12-26 09:39:40 +08:00
    avenger
        1
    avenger  
       2019-12-14 09:21:18 +08:00 via iPhone
    参考官方 package 模式开发不好吗?
    zhyt0520
        2
    zhyt0520  
       2019-12-14 15:58:55 +08:00 via Android
    我也想知道
    TeslaLyon
        3
    TeslaLyon  
       2019-12-20 11:54:42 +08:00
    @avenger 老哥,求多指点指点,没有找到相关文档。。
    avenger
        4
    avenger  
       2019-12-20 15:20:35 +08:00   ❤️ 1
    TeslaLyon
        5
    TeslaLyon  
       2019-12-20 16:47:07 +08:00
    @avenger 谢谢
    lijialong1313
        6
    lijialong1313  
    OP
       2019-12-20 17:20:09 +08:00
    @avenger 按照 laravel 这里说的应该是和 vendor 的开发吧,但是要怎么解决 app 里面文件的问题这里没有说啊。你的意思是不是:
    route 这类采用 laravel 的挂载,自己写一个 provider 然后添加到 kenerel 里
    app 的话修改 composer 文件让其挂在其他目录为 app 目录
    avenger
        7
    avenger  
       2019-12-20 17:55:23 +08:00
    @lijialong1313 既然要模块化,就要把可以独立的包抽象出来,可以有自己的 Route,自己的 provider,再通过 autoload 注入 App,可以参考一下官方的包是怎么写的,例如 Horizon、Telescope 这些。
    lijialong1313
        8
    lijialong1313  
    OP
       2019-12-26 09:39:40 +08:00
    @avenger 我研究了一下 autoload,但是我们手上这个需要模块化的项目,各方面是强相关的,不是特别适合于抽象。

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

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

    我希望的就是能不能有一些解决方案能类似 composer 一样,但是不使用 vendors 文件夹。
    有关 laravel 和 composer 我看过文档,问题主要在 composer 和 laravel 给的比较固定死,比如路由固定死了要用这个方法挂载,但是挂载之后,我希望对部分模块进行中间件的拦截(比如推送系统需要嵌套微信登录,微信登陆用 overtrue 的,而且这个中间件基于它的还有二次修改),这时候似乎 laravel 和 composer 都比较有心无力。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2913 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:52 · PVG 10:52 · LAX 19:52 · JFK 22:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.