簡體   English   中英

覆蓋Yii 1.1.14框架類而不替換它們

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM