我有一些自定义逻辑需要插入CDbCommand,CDbTransaction& Yii框架附带的CActiveRecord类。我无法替换它们,因为我正在为其他项目使用相同的框架文件。
我的大多数模型已经生成并从CActiveRecord扩展。我知道我可以轻松地将它们切换到我自己从CActiveRecord扩展的自定义类。但是,如果我扩展CDbCommand类,我想要在CDbCommand中覆盖的方法不会被过滤到CActiveRecord中,此外CDbCommand被许多其他Framework类使用。我需要所有其他框架类来使用我的CDbCommand方法覆盖。
有什么想法吗?
答案 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/