【问题标题】:Override Yii 1.1.14 framework classes without replacing them覆盖 Yii 1.1.14 框架类而不替换它们
【发布时间】:2014-06-10 10:08:37
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 如果你将 CDbCommand 类重写为你自己的 MyDbCommand 它不一定会影响框架类,只有当你想重写 CDbCommand 私有字段并使用你自己的时,这将是一个问题。
  • 我需要所有其他框架类来使用我在 MyDbCommand 中对 CDbCommand 方法的覆盖

标签: php oop yii frameworks


【解决方案1】:

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

原始答案

就 Yii 1.1.* 而言,最好的方法似乎是将文件的覆盖版本放在一个文件夹中,例如

/protected/component/overridden/ 文件夹

然后将应用程序绑定到自定义类,方法是将它们添加到导入配置中

/protected/config/main.php.

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

这将调用自定义类文件,即使是由框架文件调用。

正确答案 - 已解决

我需要的是 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/ 中的我的自定义文件

【讨论】:

  • 从代码中可以看出,我需要编辑这些文件以嵌入自动审核和操作日志。这些将在通过CActiveRecordCDbCommand 使用数据库事务通过CDbTransaction 完成的所有CRUD 操作上将审计行添加到审计数据库中
【解决方案2】:

覆盖

要覆盖 CDbCommand 和 CDbTransaction,您应该覆盖 CDbConnection。我的大多数 Yii 项目都覆盖了许多 Yii 类,包括您问题中提到的类。工作量很大,但您别无选择。

对我来说,在开始项目时覆盖您使用的所有类是一种很好的做法。一旦您使用自定义的 ActiveRecord、DbConnection、DbCommand 和 DbTransaction、Html 和小部件类编写项目模板,就无需再解决扩展 Yii 类的问题。

分叉

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

【讨论】:

    【解决方案3】:

    yii forums 中有一个类似的问题,涉及 CHtml 等类,它们在整个框架和生成的代码中静态调用。

    似乎没有什么好办法,讨论中的共识是执行以下操作(例如 CHtml):

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

    它不是很漂亮,但它可以工作并且在 Yii 更新时可以合理维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 2012-09-24
      • 2016-07-06
      • 2017-05-22
      相关资源
      最近更新 更多