Php 重写Yii2类
假设yii2应用程序是高级的。我想覆盖Php 重写Yii2类,php,yii2,Php,Yii2,假设yii2应用程序是高级的。我想覆盖\yii\helpers\endoctor::hasIntl()的基本实现,该实现由yii\web\Response间接使用 原始代码 protected static function hasIntl() { return extension_loaded('intl'); } 我想要的代码 <?php namespace backend\components; class Inflector extends \yii\helpers\
\yii\helpers\endoctor::hasIntl()
的基本实现,该实现由yii\web\Response
间接使用
原始代码
protected static function hasIntl()
{
return extension_loaded('intl');
}
我想要的代码
<?php
namespace backend\components;
class Inflector extends \yii\helpers\Inflector
{
protected static function hasIntl()
{
return false;
}
}
但是没有使用自定义实现。它继续使用原来的一个。因此,问题是:
- 为什么不工作
- 一个好的替代方案?(贴了一张丑陋的照片)
Yii::$container->set
方法,但在这种情况下不起作用,即使这样做:
Yii::$container->set('\yii\helpers\Inflector', [
'class' => '\backend\components\Inflector',
]);
我不认为这是一个优雅的解决方案< /强> 我可以通过以下方法解决此问题:
Yii::$classMap['yii\helpers\Inflector'] = '@path/to/new/file'
但这看起来不像其他解决方案那么优雅,就像替换文件一样。在这种情况下,新文件必须具有原始名称空间yii\helpers\endoctor
和扩展yii\helpers\baseendoctor
官方确认了这种方法,但类映射看起来有点不同:
Yii::$classMap['yii\helpers\Inflector'] = '@app/components/Inflector.php';
我对Yii一无所知,但如果这能帮上忙的话,我有个建议。看起来您可以自己定义一个类
yii\helpers\endoctor
,并让它扩展yii\helpers\baseendoctor
(包含默认实现)。不确定这就是你想要的(甚至不确定它是否有效,但有人提到了)。是的,谢谢你的推荐。有趣的线索。但他最终没有说要把文件放在哪里进行覆盖。我认为创建一个名称空间与原始名称空间相同的类是不正确的。我打算做扩展版本,并告诉框架使用它。是的,这是我实现的“丑陋”解决方案。但在本例中,新文件实际上正在替换原始文件。使用相同的名称空间和所有内容。嗯,在某个点上,必须告诉框架使用哪个类。。。与普通应用程序类相比,框架类的工作原理稍有不同(人们可能会称之为丑陋)。保留建议的注释,因为它会更改默认行为。
Yii::$classMap['yii\helpers\Inflector'] = '@app/components/Inflector.php';