【问题标题】:How to extend a model that is part of an Yii2 extension?如何扩展属于 Yii2 扩展的模型?
【发布时间】:2017-05-17 12:20:55
【问题描述】:

在我的应用程序中,我使用了一个扩展程序(我拥有并且可以修改)。这个扩展有一个基于 ActiveRecord 的类,我想用另一个属性在应用程序中扩展它。我能以某种方式做到这一点吗?可以FactoryYii behaviour 提供帮助吗?

扩展类:

namespace extension;

/**
 * @property integer $id
 * @property string  $name
 */
class Product extends ActiveRecord {

    public static function tableName() {
        return 'product';
    }

    /**
     * @inheritdoc
     */
    public function rules() {
        return [
            [['id', 'name'], 'required'],
            [['id'], 'integer'],
            [['name'], 'string'],
        ];
    }
}

扩展中还有一个 ProductController 和相应的视图文件(索引、创建、更新、视图、_form),这些文件是用 gii 定期生成的。我只想在产品中添加另一个属性$description(字符串,必需)。可以进行迁移以添加所需的列。

我是否必须覆盖模型和控制器类以及视图文件?还是更优雅的解决方案?

例如,考虑在扩展中发生的标准对象创建

public function actionCreate() {
    $model = new Product();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'language' => $model->language]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

据我了解,我无法影响创作。还是我错了?

我的印象是我必须覆盖所有内容(还有视图文件,因为必须显示属性)然后更改controllerNamespace

【问题讨论】:

  • 您可以简单地使您的扩展可配置...或者您可以使用类映射功能:yiiframework.com/doc-2.0/…
  • @soju 班级地图在我看来有点老套。不是吗?我可以通过哪种方式使扩展可配置(我仍然对整个配置不太熟悉)?可以为此准备扩展。

标签: yii2 overriding yii2-extension


【解决方案1】:

就扩展类而言,只需继续添加属性即可。您的新类将继承父类的所有内容并拥有您的新属性。

关于覆盖生成的文件,在生成文件时,gii 中有一个 diff 选项,因此您可以预览并决定保留什么以及覆盖什么。但是请注意,您必须手动合并任何更改。

【讨论】:

  • 我知道如何扩展类。考虑创建对象的位置:在扩展中。我应该如何更改创建对象时使用的类?我想使用扩展中代码的其余部分(控制器、视图、其他逻辑)。
  • 对不起,我误解了你,我可能仍然误解了,但如果我理解正确的话:我认为你只需要确定你想在控制器中创建哪个对象并说明额外的财产。或者,也许您总是可以使用该类的“新”版本,因为它是旧版本的超集。它通常应该适用于旧版本的所有情况。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2015-01-29
  • 2013-11-10
  • 2018-05-11
相关资源
最近更新 更多