我有两个数据库连接,一个用于我的大多数应用程序数据,另一个用于读取.
虽然我可以将我的数据库用户帐户设置为仅允许读取,但还有其他人管理此系统,我希望在应用程序级别有一些冗余,以绝对防止使用Yii的标准ActiveRecord类进行无意的写入.
在论坛上发现了这一点信息,但想知道是否有人可以确认这是一个好方法和/或建议另一个.
public function onBeforeSave($event)
{
$this->db = Yii::app()->masterDb;
}
public function onAfterSave($event)
{
$this->db = Yii::app()->db;
}
Run Code Online (Sandbox Code Playgroud)
根据您提供给 Yii 论坛的链接,有一个扩展可以为您处理此问题: http: //www.yiiframework.com/extension/dbreadwritesplitting
如果你有很多 AR 模型,我可能会首先研究这一点。您可以选择“行为”路线(如该论坛帖子中建议的那样)作为另一种选择。
但无论你做什么,你都需要覆盖 beforeSave / afterSave 而不是 onBeforeSave / onAfterSave。这些方法用于触发事件,而不仅仅是运行您自己的特殊代码。而且,根据另一篇论坛帖子,您需要使用静态调用来设置 AR db 变量。所以谢尔盖的代码实际上应该是:
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 {}
...
Run Code Online (Sandbox Code Playgroud)