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

2015-04-23 14:34:00 +08:00
 kchum
可能标题不太清楚

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

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

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

提供下关键字,谢谢!
2811 次点击
所在节点    PHP
10 条回复
Scholer
2015-04-23 14:35:52 +08:00
在github上 fork一下 然后在composer里指定自己fork的地址作为源
orvice
2015-04-23 14:39:07 +08:00
@Scholer 这样也算修改A了。。升级麻烦
Scholer
2015-04-23 14:42:57 +08:00
@orvice 那你建一个workbench 然后依赖一下它 再继承之 其实也就这两种方法可用
kchum
2015-04-23 14:45:58 +08:00
@Scholer 引用的地方没办法不修改?
babyname
2015-04-23 14:55:55 +08:00
当然用b 又想偷懒 又想扩展 哪有那么好的事
loserwn
2015-04-23 14:57:19 +08:00
我觉得当前 po 主的方案也是最可行的。貌似没有太优雅的方案了
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
2015-04-23 15:08:53 +08:00
@kchum 修改别名或者namespace 完全不改动应该比较难实现
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
2015-04-23 16:44:36 +08:00
extends ?

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

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

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

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

© 2021 V2EX