Yii2:模块内的可配置模型
将Yii2模块中的模型/活动记录包含在可配置模式中的最佳做法是什么?Yii2:模块内的可配置模型
这些都只是一些当我们要使用包含在模块内的ActiveRecord的,我们面临的问题:
添加事件&行为,型号/ activerecords由模块提供。我想使用Yii2的configuration format将事件和行为附加到模块中包含的模型。如何才能做到这一点?
定义与模块外部存在的模型/活动记录的关系。将模块内包含的activerecord链接到用户activerecord时,我们可以依赖
Ỳii::$app->user->identityClass
,但对于其他自定义关系,我们可能需要扩展activerecord。有没有更好的方法?从模块中扩展activerecord类有点失败了模块化的目的。在模块/主动记录中配置各种其他变量。假设我们想调整最大字符串长度验证值。在模块控制器中,我们始终可以使用
$this->module->params
来读取任何自定义值,但我们无法从模型或ActiveRecord执行此操作。我们应该做什么呢?
截至7月2017,Yii2不允许ActiveRecord的依赖注入!
参见:
- https://github.com/yiisoft/yii2/issues/8639
- https://github.com/yiisoft/yii2/issues/11575
- https://github.com/yiisoft/yii2/issues/5786
- https://github.com/yiisoft/yii2/pull/14078
- https://github.com/yiisoft/yii2/issues/13779
只有大约t办法他将通过Yii::$app->params
来配置你的模块,然后在模块AR中使用这些值(例如,当做验证时)。
我想你可能最终使用dependency injection:
写的扩展名 “\ COMMON \分机\ 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);
}
现在[本机支持](http://www.yiiframework.com/doc-2.0/yii-base-application。html#$ container-detail),但ActiveRecord关系仍然不起作用,因为核心Yii用'new'实例化AR,所以它们不会注入它们的依赖关系。 – mae
怎么了?我的答案与https://github.com/yiisoft/yii2/issues/8639 –
@ e-frank中的可能解决方案1完全匹配。它需要引导。我不希望模块在每个页面上引导,我只在少数情况下需要它。 – mae
你可以引导一个派生类。 –