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

[Laravel & Composer] 怎样扩展包 A 功能,但不修改 A 源码,其他引用也不用修改?

  •  
  •   kchum · 2015-04-23 14:34:00 +08:00 · 2727 次点击
    这是一个创建于 3293 天前的主题,其中的信息可能已经有所发展或是发生改变。
    可能标题不太清楚

    详情是这样的,
    项目用 Laravel ,用了包 A,很多地方都有引用了,
    现在发现我们要在 A 上扩展再拿过来用

    目前能行的方案是,
    1.修改包 A,但 A 会升级(要兼容升级,不考虑)
    2.写个 包 B 继承 A,引用那里在全部修改成 B

    我想问的是,有没有优雅的方案,在引用的地方不用再修改?

    提供下关键字,谢谢!
    10 条回复    2015-04-23 16:44:36 +08:00
    Scholer
        1
    Scholer  
       2015-04-23 14:35:52 +08:00
    在github上 fork一下 然后在composer里指定自己fork的地址作为源
    orvice
        2
    orvice  
       2015-04-23 14:39:07 +08:00
    @Scholer 这样也算修改A了。。升级麻烦
    Scholer
        3
    Scholer  
       2015-04-23 14:42:57 +08:00
    @orvice 那你建一个workbench 然后依赖一下它 再继承之 其实也就这两种方法可用
    kchum
        4
    kchum  
    OP
       2015-04-23 14:45:58 +08:00
    @Scholer 引用的地方没办法不修改?
    babyname
        5
    babyname  
       2015-04-23 14:55:55 +08:00 via iPhone
    当然用b 又想偷懒 又想扩展 哪有那么好的事
    loserwn
        6
    loserwn  
       2015-04-23 14:57:19 +08:00
    我觉得当前 po 主的方案也是最可行的。貌似没有太优雅的方案了
    gDD
        7
    gDD  
       2015-04-23 14:57:23 +08:00
    如果你在代码里是采用的 IoC 注入的 A 实例,那么以下步骤:

    1. 写个 B 继承 A。
    2. 在合适的地方加入 `App::bind('VendorNamespace\A', 'YourNamespace\B');` (测试目的放入 routes.php 就行,成功以后写一个 Service Provider)。

    经过这两步应该就可以了,理论上第二步 bind 的第一个参数应该是一个 Interface,但是我在没有测试的情况下大略看了一眼代码没有要求非得是 Interface,所以应该可行(请测试后告诉我们结果)。

    以上方法只是可行,但不推荐采用,而且前提是你用的是 IoC 注入的 A 才可行。如果不是还是用你的方案 2 吧。
    Scholer
        8
    Scholer  
       2015-04-23 15:08:53 +08:00
    @kchum 修改别名或者namespace 完全不改动应该比较难实现
    mcfog
        9
    mcfog  
       2015-04-23 15:19:50 +08:00
    https://getcomposer.org/doc/04-schema.md#replace

    my/A

    ...
    replace:
    real/A: 1.0.0
    ...



    composer require my/A
    guoer
        10
    guoer  
       2015-04-23 16:44:36 +08:00
    extends ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2442 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:01 · PVG 00:01 · LAX 09:01 · JFK 12:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.