[英]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.