ZheX Blog Idea来源于生活的经验

12六/094

Yii Framework: 为 ActiveReord 添加表前缀

Yii framework 默认情况下并没有为数据表设置 prefix 的功能。 根据作者 qiang 的说话是这个功能并不是必须的,需要的用户可以自己建立扩展。确实是这样,在 Yii framework 完全 OO 的结构下,我们可以很方便的来实现表前缀扩展功能。接下来让我们看看如何来实现:


首先在我们的配置文件中 /wwwroot/protected/config/main.php 中添加下面的代码:

<?php
return array(
    "params" => array(
        "dbPrefix" => "e_",   
    ),
);
?>

这串代码中,我们定义了一个表前缀的名为 dbPrefix 的参数。

接着就要添加我们 CActiveRecord 的继承类了,以下的代码中我们建立了一个 MyActiveRecord 的继承类, 可以把它存放在 /wwwroot/protected/extensions/ 目录中:

<?php
class EActiveRecord extends MyActiveRecord {
 
   public $prefix;
 
   public function __construct($attributes = array(), $scenario = "") {
      parent::__construct($attributes, $scenario);
      $this->prefix = Yii::app()->params->dbPrefix;
 
   }
 
   public function tableName() {
      // return table name with prefix   
      return $this->prefix . get_class($this);
   }   
}
?>

在我们以后的项目中我们的 Model 都用 MyActiveRecord 代替原来的 CActiveRecord 就可以使用表前缀了。

如果我们需要使用 RBAC 功能,我们还可以继承 CDbAuthManager:

<?php
class MyDbAuthManager extends CDbAuthManager {
 
    public function init() {
        $prefix  = Yii::app()->params->dbPrefix;
        $this->itemTable = $prefix . $this->itemTable;
        $this->itemChildTable = $prefix . $this->itemChildTable;
        $this->assignmentTable = $prefix . $this->assignmentTable;
 
        parent::init();
 
    }
}
?>

关联文章:

  1. Yii Framework: 修改核心 JS 文件位置
  2. 教程翻译:用 Yii Framework 编写博客 – 1
  3. 教程翻译:用 Yii Framework 编写博客 – 5
  4. 教程翻译:用 Yii Framework 编写博客 – 4

评论 (4) 引用 (0)
  1. 您好,非常感谢您的文章,受益非浅。
    能再详细介绍下结合角色控制在Yii下的用法吗?
    比如需要建什么结构的表来配合?
    在不同actions module 里该如何使用它?

    谢谢!

  2. rbac所要用到的几个数据表在官方的文档里有详细的介绍,你可以去官方网站看下指南,有中文版翻译的。在框架中也有个sql文件在帮住你自动建立这些数据表。 rbac在module里的用法是相同的。

  3. 我有点搞糊涂了,

    blog中先前是
    class EActiveRecord extends MyActiveRecord
    而之后是 Model 都用 MyActiveRecord 代替原来的 CActiveRecord 就可以使用表前缀了。

    MyActiveRecord定义在哪里?

    还有即使这样, 如果表已经存在的情况下, 并且有表前缀, 如果我用命令行来生成脚手架, 貌似也不方便? 代码生成后手动去调整? 但那个时候生成的类已经是具有表前缀的类了, 请问楼主有什么好办法解决? 谢谢!

  4. 你可以在protected目录下添加extensions目录,然后用import在config文件中导入这个目录,这样你在这个目录下的扩展都会被自动读取。 由于这个是扩展功能,脚手架只能一些基本功能,不可能什么都依赖脚手架。 如果楼上有兴趣,可以重新写一个支持表扩展的脚手架。


发表评论


还没有引用.