0

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

当我们想要使用包含在模块中的 activerecord 时,这些只是我们面临的一些问题:

  1. 向模块提供的模型/活动记录添加事件和行为。我想使用 Yii2 的配置格式将事件和行为附加到模块中包含的模型。如何才能做到这一点?

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

  3. 在模块/活动记录中配置各种其他变量。假设我们要调整最大字符串长度验证值。在模块控制器中,我们总是可以$this->module->params用来读取任何自定义值,但我们不能从模型或 ActiveRecord 中做到这一点。我们应该怎么做呢?

4

2 回答 2

1

我认为您最终可能会使用依赖注入

写一个扩展“\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);
}
于 2016-07-26T13:39:36.943 回答
0

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

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

看:

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

于 2017-07-10T02:36:58.137 回答