请问对于 Laravel 要模块化的问题,有没有什么好的解决方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lijialong1313
V2EX    PHP

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

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

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

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

    我希望的就是能不能有一些解决方案能类似 composer 一样,但是不使用 vendors 文件夹。
    有关 laravel 和 composer 我看过文档,问题主要在 composer 和 laravel 给的比较固定死,比如路由固定死了要用这个方法挂载,但是挂载之后,我希望对部分模块进行中间件的拦截(比如推送系统需要嵌套微信登录,微信登陆用 overtrue 的,而且这个中间件基于它的还有二次修改),这时候似乎 laravel 和 composer 都比较有心无力。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2617 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 02:32 PVG 10:32 LAX 18:32 JFK 21:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86