基于常数的Yii模型覆盖

时间:2017-01-09 06:59:30

标签: php oop yii yii2 yii2-model

我需要在yii2项目中更改模型类。由于数据库发生了变化,因此需要根据模型类的所有查询进行转换 到新的数据库表。但是我想要旧的数据库配置,因为如果我的新数据库出现问题,那么我可以很容易地转移到所有数据库 模型类查询(故障转移)。所以我想要一个旧的模型类,并使用基于常量的新模型类函数覆盖它。如果我已经设定,那就不变 old(0)然后选择旧的db类查询或new(1)然后用新查询覆盖模型。请问如何使用OOPS概念实现这一点 帮助。

class ModelClass extends ActiveRecord
{
    public static function tableName()
    {
        return 'table1';
    }
    public function getData($limit = '5', $offset = '0')
    {
     //
    }
}

新模型类。

class NewModelClass extends ModelClass
{
    public static function tableName()
    {
        return 'table2';
    }
    public static function getDb()
    {
        return \Yii::$app->get('newDb'); // second database
    }
    public function getData($limit = '5', $offset = '0')
    {
     //
    }
}

在Controller类中,我在名称空间中使用父模型类,如:

use api\modules\v1\models\ModelClass;

用于调用模型的功能:

$objModel = new ModelClass(); // call parent class 
$objModel->getData();

在params中定义常量:

'model' => '1', // 1 means new or 0 means old

然后如何在模型之间切换而不在控制器的任何地方放置if else条件。需要基本检查0/1才能在模型类之间切换。

2 个答案:

答案 0 :(得分:0)

我不完全明白你的意思。那是吗?

$config = array('model' => 1);

$model = $config['model'] == 1
    ? new api\modules\v1\models\ModelClass()
    : new api\modules\v1\models\NewModelClass();

答案 1 :(得分:0)

如果有人知道更好的解决方案,请随时纠正我!

我认为你可以直接在新模型的方法中做到,

像这样:

class NewModelClass extends ModelClass
{
    const $useNew = true;

    public static function tableName()
    {
        if ($useNew) return parent::tableName();
        return 'table2';
    }
    public static function getDb()
    {
        if ($useNew) return parent::getDb();
        return \Yii::$app->get('newDb'); // second database
    }
    public function getData($limit = '5', $offset = '0')
    {
        // Although there is problem with non-static methods
        // as you need instance of parent class, in php
        // you can get away with warning if you use following,
        // but just in case, you dont use an instance of parent
        // class or $this word in parent class method
        if ($useNew) return parent::getData(limit , $offset);
     //
    }
}

Discussion about using call to parent within non-static method

编辑:

刚想到你可以使用魔法__construct方法,对于像这样的非静态方法,不确定它是否会起作用

class NewModelClass extends ModelClass
{
    const $useNew = true;

    public function __construct() {
        if ($useNew) parent::__construct();
    }
}

如果这不起作用那么可能

class NewModelClass extends ModelClass
{
    const $useNew = true;

    public function NewModelClass() {
        if ($useNew) {
            $this = new parent::__construct();
            // or $this = new ModelClass();
        }
    }
}

然后在非静态方法中你应该能够只收到$ this等...

如果有人知道更好的解决方案,请随时纠正我!