覆盖Yii 1.1.14框架类而不替换它们

时间:2014-04-24 21:46:55

标签: php oop yii frameworks

我有一些自定义逻辑需要插入CDbCommand,CDbTransaction& Yii框架附带的CActiveRecord类。我无法替换它们,因为我正在为其他项目使用相同的框架文件。

我的大多数模型已经生成并从CActiveRecord扩展。我知道我可以轻松地将它们切换到我自己从CActiveRecord扩展的自定义类。但是,如果我扩展CDbCommand类,我想要在CDbCommand中覆盖的方法不会被过滤到CActiveRecord中,此外CDbCommand被许多其他Framework类使用。我需要所有其他框架类来使用我的CDbCommand方法覆盖。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

yii forums中有一个类似的问题,关于像CHtml这样的类,它们在整个框架和生成的代码中被静态地控制。

似乎没有很好的方式,讨论中的共识是做以下(例如CHtml):

将CHtml.php移动到Html.php并将该类重命名为Html。 创建一个新的空CHtml类,它扩展了Html。 将覆盖添加到新的CHtml类。

它并不漂亮,但它可以工作,并且在Yii更新上合理可行。

答案 1 :(得分:2)

覆盖

要覆盖CDbCommand和CDbTransaction,您应该覆盖CDbConnection。我的大多数Yii项目都有很多Yii类被覆盖,包括你问题中提到的类。这是很多工作,但你几乎没有选择。

对我来说,最好是重写所有使用的课程来开始项目。一旦使用自定义ActiveRecord,DbConnection,DbCommand和DbTransaction,Html和窗口小部件类编写项目模板,就不需要解决再次扩展Yii类的问题。

当然,您总是可以直接将自定义逻辑分叉并添加到Yii类,或者调整一些内容以轻松地扩展类。有时,这是最简单的解决方案。

答案 2 :(得分:1)

==下面添加的正确答案==

原始回答

就Yii 1.1。*而言,最好的办法似乎是将文件的首要版本放入文件夹,例如

/protected/component/overridden/文件夹

然后通过将应用程序添加到

中的导入配置来将应用程序绑定到自定义类

/protected/config/main.php

    'import'=>array(
        'application.components.CDbConnection',
        'application.components.CDbTransaction',
        'application.components.CDbConnection',
        ...
    ),

然后,即使在Framework文件调用时,也会调用自定义类文件。

正确的答案 - 已解决

我需要的是index.php(项目根目录)

末尾的以下内容
Yii::$classMap= [
    'CActiveRecord' => dirname(__FILE__) . 
        '/protected/components/auditAndOps/CActiveRecord.php',
    'CDbCommand' => dirname(__FILE__) . 
        '/protected/components/auditAndOps/CDbCommand.php',
    'CDbTransaction' => dirname(__FILE__) . 
        '/protected/components/auditAndOps/CDbTransaction.php',
];

Yii::createWebApplication($config)->run();

这主要是将相应框架文件的原始classMap位置重新映射到/protected/components/auditAndOps/

中的自定义文件