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

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

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

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

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

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