【发布时间】:2018-05-25 04:48:33
【问题描述】:
假设我有这样的配置(来自official guide的sn-p):
$config = [
// ...
'container' => [
'definitions' => [
'yii\widgets\LinkPager' => ['maxButtonCount' => 5],
],
],
// ...
];
我创建了一个名为 FancyLinkPager 的类:
class FancyLinkPager extends \yii\widgets\LinkPager
{
// ...
}
当我像这样创建 FancyLinkPager 类的对象时(请忽略 $pagination 对象,为了正确起见,它在这里):
$pagination = \Yii::createObject(Pagination::class);
$linkPager = \Yii::createObject(['class' => LinkPager::class, 'pagination' => $pagination]);
$fancyLinkPager = \Yii::createObject(['class' => FancyLinkPager::class, 'pagination' => $pagination]);
$linkPager->maxButtonCount; // 5 as configured
$fancyLinkPager->maxButtonCount; // 10 as LinkPager's default
我的问题是我希望 $fancyLinkPager->maxButtonCount 按照配置为 5。我知道我可以在配置中添加另一行或对其进行调整以指定我的自定义类,但这不是我的解决方案,因为:
- 我想保持代码干燥
- 这是我的需求的一个过分简化的示例 - 在现实世界中,您不希望有多个 LinkPager 的子类,但其他对象很有可能
我的问题是:是否有任何框架支持的方式来实现这一点?我想出的解决方案是:
- 在 FancyLinkPager(或另一个中间类或特征)中破解自定义 __construct,以便它查看 App 的配置并在实例上调用 Yii::configure,但我没有找到以通用方式执行此操作的好方法
- 使用“设置”对象(如 LinkPagerSettings)将依赖项注入 FancyLinkPager,并在我的配置的容器部分配置该类,但使用普通 LinkPager 实例也会带来一些麻烦
也许唯一真正的解决方案是创建我自己的 yii\di\Container 实现,它允许从父类继承配置,但在我深入研究之前,我想知道我是否没有忽略什么。
【问题讨论】:
-
有同样的问题:我认为无法配置父类。因此我的配置有一些冗余设置...根据this,覆盖 Container 可能会导致性能问题,因为 .我认为您的构造函数方法是合理的。如果您要意识到这一点,请发布答案。
-
感谢 @robsch 向我指出 Yii2 的工作人员对此的评论,我自己找不到。这让我明白,如果配置继承是可选的和有意的,那将是最好的。
标签: php inheritance dependency-injection yii2