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