[英]Override Yii 1.1.14 framework classes without replacing them
我有一些自定义逻辑,我需要插入Yii框架随附的CDbCommand,CDbTransaction和CActiveRecord类。 我无法替换它们,因为我在其他项目中使用了相同的框架文件。
我的大多数模型已经生成,并从CActiveRecord进行了扩展。 我知道我可以轻松地将它们切换到从CActiveRecord扩展的我自己的自定义类。 但是,如果我扩展CDbCommand类,则要在CDbCommand中覆盖的方法不会被过滤到CActiveRecord中,此外,许多其他Framework类都使用CDbCommand。 我需要所有其他框架类来使用CDbCommand方法的替代。
有任何想法吗?
yii论坛中存在类似的问题,涉及诸如CHtml的类,这些类在整个框架和生成的代码中都是静态进行校准的。
似乎没有很好的方法,讨论中的共识类型是执行以下操作(示例CHtml):
将CHtml.php移至Html.php,并将该类重命名为Html。 创建一个新的空CHtml类,以扩展Html。 将您的覆盖添加到新的CHtml类。
它虽然不漂亮,但是可以正常工作,并且可以在Yii更新中合理维护。
要覆盖CDbCommand和CDbTransaction,您应该覆盖CDbConnection。 我的大多数Yii项目都覆盖了许多Yii类,包括您的问题中提到的类。 这是很多工作,但您别无选择。
对我来说,从覆盖您使用的所有类开始项目是一个好习惯。 一旦使用自定义ActiveRecord,DbConnection,DbCommand和DbTransaction,Html和窗口小部件类编写了项目模板,就无需再解决扩展Yii类的问题了。
当然,您总是可以直接将自定义逻辑派生并添加到Yii类中,或进行一些调整以轻松扩展类。 有时,这是最简单的解决方案。
==正确答案添加在下面==
原始答案
就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();
这实际上是将相应Framework文件的原始classMap
位置重新映射到/protected/components/auditAndOps/
自定义文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.