【问题标题】:Yii2: Configurable models inside moduleYii2:模块内的可配置模型
【发布时间】:2016-07-26 06:20:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: activerecord module yii2 yii2-model


    【解决方案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);
    }
    

    【讨论】:

    • 现在是 natively supported,但是 ActiveRecord 关系仍然无法工作,因为核心 Yii 使用 new 实例化 AR,因此它们不会注入依赖项。
    【解决方案2】:

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

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

    见:

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

    【讨论】:

    • 怎么了?我的回答完全符合github.com/yiisoft/yii2/issues/8639 的可能解决方案 1
    • @e-frank 它需要引导。我不希望模块在每次页面加载时都启动,我只在少数情况下需要它。
    • 你可以引导一个派生类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2018-12-24
    • 2017-08-26
    相关资源
    最近更新 更多