Yii将数据库连接限制为只读

gcuhipw9  于 2022-11-09  发布在  其他
关注(0)|答案(3)|浏览(174)

我有两个数据库连接,一个用于我的大多数应用程序数据,另一个仅用于读取。
虽然我可以设置我的数据库用户帐户只允许读取,但还有其他人在管理这个系统,我希望在应用程序级别有一些冗余,以绝对防止使用Yii的标准ActiveRecord类进行意外写入。
在论坛上发现了这一点信息,但我想知道是否有人可以确认这是一个好的方法和/或建议另一个。

public function onBeforeSave($event)
{
   $this->db = Yii::app()->masterDb;
}

public function onAfterSave($event)
{
   $this->db = Yii::app()->db;
}

http://www.yiiframework.com/forum/index.php/topic/5712-active-record-save-to-different-server-load-balancefail-over-setup/

ht4b089n

ht4b089n1#

根据您提供给Yii论坛的链接,有一个扩展可以为您处理这个问题:http://www.yiiframework.com/extension/dbreadwritesplitting
如果你有很多AR模型的话,我可能会先考虑一下这个问题。你可以选择行为路线(正如论坛帖子中所建议的)。
但是无论你做什么,你都希望覆盖beforeSave / afterSave而不是onBeforeSave / onAfterSave。这些方法是用来触发事件的,而不仅仅是运行你自己的特殊代码。而且,根据another one of the forum posts,你需要使用一个静态调用来设置你的AR db变量。所以Sergey的代码实际上应该是:

class MyActiveRecord extends CActiveRecord
{
    ...
    public function beforeSave()
    {
       // set write DB
       self::$db = Yii::app()->masterDb;

       return parent::beforeSave();
    }

    public function afterSave()
    {
       // set read db 
       self::$db = Yii::app()->db;

       return parent::beforeSave();
    }
    ...
}

class User extends MyActiveRecord {}
class Post extends MyActiveRecord {}
...
lvjbypge

lvjbypge2#

假设你的从节点不能和主节点一起更新,你可能会遇到问题,因为在更新数据之后,你可能会从一个旧的版本中读取数据。
虽然论坛上给出的方法都很干净,而且大多数都是由Yii向导编写的,但我也有一个替代方法。你可以在AR中重写getDbConnection()方法,比如

public function getDbConnection(){
  if (Yii::app()->user->hasEditedData()) { # you've got to write something like this(!)
     return Yii::app()->masterDb;
  } else {
     return Yii::app()->db;
  }
}

但是在切换数据库连接时仍然要小心。

qltillow

qltillow3#

class MyActiveRecord extends CActiveRecord
{
...
public function onBeforeSave($event)
{
   // set write DB
   $this->db = Yii::app()->masterDb;
}

public function onAfterSave($event)
{
   // set read db 
   $this->db = Yii::app()->db;
}
...
}

class User extends MyActiveRecord {}
class Post extends MyActiveRecord {}
...

你必须试一下。但在我看来,它还不够好。我认为会有一些错误或缺陷。

相关问题