Yii2:模块内部的可配置模型

时间:2016-07-26 06:20:17

标签: activerecord module yii2 yii2-model

在Yii2模块中以可配置的方式包含模型/主动记录的最佳做法是什么?

这些只是我们想要使用模块中包含的activerecord时遇到的一些问题:

  1. 添加活动&对模块提供的模型/活动记录的行为。我想使用Yii2 configuration format将事件和行为附加到模块中包含的模型中。怎么办呢?

  2. 定义与模块外部存在的模型/活动记录的关系。将模块中包含的activerecord链接到User activerecord时,我们可以依赖Ỳii::$app->user->identityClass,但对于其他自定义关系,我们可能需要扩展activerecord。有没有更好的方法?从模块扩展activerecord类有点违背了模块化的目的。

  3. 在module / activerecord中配置各种其他变量。我们想说我们要调整最大字符串长度验证值。在模块Controller中,我们总是可以使用$this->module->params来读取任何自定义值,但我们无法从Model或ActiveRecord中执行此操作。我们应该做什么呢?

2 个答案:

答案 0 :(得分:1)

我认为您最终可能会使用dependency injection

写一个扩展名“\ common \ extensions \ MyBootstrap”:

namespace common\extensions;

use Yii;
use yii\base\BootstrapInterface;
use yii\base\Application;

class MyBootstrap implements BootstrapInterface {
    /**
     * @param  Application $app Application
     **/
    public function bootstrap($app) {
        Yii::$container->set("common\\modules\\test\\models\\Test1", "common\\modules\\test\\models\\Test2");
    }
}

添加到您的配置:

'bootstrap' => [
    'common\extensions\MyBootstrap',
],

'components' => [ 
    //  ... 
]

在您的代码中,您必须使用Yii::$container->get()

$test = Yii::$container->get('common\modules\test\models\Test1');
var_dump($test);

将创建Test2模型而不是Test1。 如果您希望ActiveRecord发生这种情况,请覆盖以下内容:

public static function instantiate($row) {
    return \Yii::$container->get(static::class);
}

答案 1 :(得分:0)

编辑:基本问题现已解决。我们可以使用DI将关系注入ActiveRecords。

截至2017年7月, Yii2不允许ActiveRecord依赖注入

见:

解决此问题的唯一方法是通过Yii::$app->params配置模块,然后在模块AR中使用这些值(例如,在进行验证时)。