Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii2:我可以使用场景为不同的操作指定不同的模型字段集吗?_Yii2_Yii2 Advanced App_Yii2 Model - Fatal编程技术网

Yii2:我可以使用场景为不同的操作指定不同的模型字段集吗?

Yii2:我可以使用场景为不同的操作指定不同的模型字段集吗?,yii2,yii2-advanced-app,yii2-model,Yii2,Yii2 Advanced App,Yii2 Model,我可以在Yi2模型页面()的“字段”部分看到,您可以设置“基于某些上下文信息的不同字段列表。例如,根据$scenario或当前应用程序用户的权限,您可以返回不同的可见字段集或过滤掉一些字段。” 但是,scenarios documentation()说,scenarios用于为模型属性验证创建不同的上下文 我使用的是yii2restfulapi,我必须使用默认操作(actionIndex、actionView等)从模型中获取数据并显示为API结果。我知道我可以重写这些方法(),但是我如何在这些方

我可以在Yi2模型页面()的“字段”部分看到,您可以设置“基于某些上下文信息的不同字段列表。例如,根据$scenario或当前应用程序用户的权限,您可以返回不同的可见字段集或过滤掉一些字段。”

但是,scenarios documentation()说,scenarios用于为模型属性验证创建不同的上下文

我使用的是yii2restfulapi,我必须使用默认操作(actionIndex、actionView等)从模型中获取数据并显示为API结果。我知道我可以重写这些方法(),但是我如何在这些方法中使用不同的字段集(取决于不同的场景)


我需要的是为actionIndex(项目列表)输出字段1、字段2、字段3,但我想为actionView(项目列表)输出字段1、字段2、字段3、字段4。

您可以在模型中执行此操作

Yii2中的默认REST实现将只包括该方法返回的属性。默认情况下,该方法返回所有属性。因此,您可以这样定义它:

class MyModel extends ActiveRecord
{
    //...
    public function fields()
    {
        switch ($this->scenario) {
            case 'my_scenario_1':
                return ['field1', 'field2'];
            case 'my_scenario_2':
                return ['field3', 'field4'];
        }
    }
}
此外,您还可以使用该方法,该方法返回给定场景的所有活动属性


别忘了在控制器中设置模型的场景。

这是我使用Yii::$app()解决此问题的方法

希望为您服务

根据本指南:

首先在模型中设置场景。例如:

const SCENARIO_LESS = 'index';
const SCENARIO_MORE = 'view';

public function scenarios()
{
    return [
        self::SCENARIO_LESS => ['field1', 'field2'],
        self::SCENARIO_MORE => ['field1', 'field2', 'field3'],
    ];
}
现在,在您的操作中,只需设置如下场景:

// scenario is set through configuration
public function actionIndex()
{
    $model = new User(['scenario' => User::SCENARIO_LESS]);
    ...
}
...
public function actionView()
{
    $model = new User(['scenario' => User::SCENARIO_MORE]);
    ...
}

应该可以了。

不确定,从未使用过rest api。。。从模型类派生,引入场景(可能还有规则),然后重写字段()?在控制器中,您必须在每个操作中对模型设置场景(即,您必须覆盖默认实现)。在字段中,您可以决定应该为隐式toArray()调用启用哪些属性。这对你有用吗?我认为这个解决方案非常脆弱,不应该使用。模型不应该知道控制器。Beowulfenator提出的解决方案应该更有效。
// scenario is set through configuration
public function actionIndex()
{
    $model = new User(['scenario' => User::SCENARIO_LESS]);
    ...
}
...
public function actionView()
{
    $model = new User(['scenario' => User::SCENARIO_MORE]);
    ...
}