2016-07-26 126 views
0

将Yii2模块中的模型/活动记录包含在可配置模式中的最佳做法是什么?Yii2:模块内的可配置模型

这些都只是一些当我们要使用包含在模块内的ActiveRecord的,我们面临的问题:

  1. 添加事件&行为,型号/ activerecords由模块提供。我想使用Yii2的configuration format将事件和行为附加到模块中包含的模型。如何才能做到这一点?

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

  3. 在模块/主动记录中配置各种其他变量。假设我们想调整最大字符串长度验证值。在模块控制器中,我们始终可以使用$this->module->params来读取任何自定义值,但我们无法从模型或ActiveRecord执行此操作。我们应该做什么呢?

回答

0

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

参见:

只有大约t办法他将通过Yii::$app->params来配置你的模块,然后在模块AR中使用这些值(例如,当做验证时)。

+0

怎么了?我的答案与https://github.com/yiisoft/yii2/issues/8639 –

+0

@ e-frank中的可能解决方案1完全匹配。它需要引导。我不希望模块在每个页面上引导,我只在少数情况下需要它。 – mae

+0

你可以引导一个派生类。 –

1

我想你可能最终使用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); 
} 
+0

现在[本机支持](http://www.yiiframework.com/doc-2.0/yii-base-application。html#$ container-detail),但ActiveRecord关系仍然不起作用,因为核心Yii用'new'实例化AR,所以它们不会注入它们的依赖关系。 – mae