2015-09-19 2 views
5

Я могу видеть на странице модели Yii2 (http://www.yiiframework.com/doc-2.0/yii-base-model.html) в разделе «поля», в котором вы можете установить «разные списки полей на основе некоторой информации о контексте. Например, в зависимости от сценария $ или привилегии текущего приложения пользователь, вы можете вернуть разные наборы видимых полей или отфильтровать некоторые поля ».Yii2: Могу ли я использовать сценарии для указания разных наборов полей модели для разных действий?

Но сценарий документации (http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios) говорит, что сценарии предназначены для создания различного контекста для проверки атрибутов модели.

Я использую Yii2 Restful API, где мне нужно использовать действия по умолчанию (actionIndex, actionView, ...) для получения данных из модели и отображения результатов API. Я знаю, что могу переопределить эти методы (http://www.yiiframework.com/doc-2.0/guide-rest-controllers.html#extending-active-controller), но как я могу сказать в этих методах использование разных наборов полей (в зависимости от разных сценариев)?

Мне нужно, чтобы вывести поле1, поле2, поле3 для actionIndex (список элементов), но я хочу вывести поле1, поле2, поле3, поле4 для actionView (список элементов).

+0

Не уверен, никогда не использовал остальные api ... Вывести из себя модельный класс, ввести сценарии (и, возможно, правила), а затем переопределить поля()? В контроллере вам нужно будет установить сценарий на модели в каждом действии (т. Е. Вы должны переопределить реализации по умолчанию). В полях вы можете затем решить, какие атрибуты должны быть включены для неявного вызова toArray(). Так ли это работает для вас? – robsch

ответ

0

Вы делаете это в своей модели.

По умолчанию реализация REST в Yii2 будет включать только атрибуты, возвращаемые методом fields(). По умолчанию этот метод возвращает все атрибуты. Таким образом, можно определить его следующим образом:

class MyModel extends ActiveRecord 
{ 
    //... 
    public function fields() 
    { 
     switch ($this->scenario) { 
      case 'my_scenario_1': 
       return ['field1', 'field2']; 
      case 'my_scenario_2': 
       return ['field3', 'field4']; 
     } 
    } 
} 

Кроме того, у вас есть метод scenarios() в вашем распоряжении, который возвращает все активные атрибуты для данного сценария.

Не забудьте установить сценарий моделей в вашем контроллере.

0

это мое решение этой проблемы, используя Yii :: $ (приложение)

public function fields() 
{ 
    if(Yii::$app->controller->action->uniqueId == 'controller/action'){ 
     return ['field_1','field_2','field_3','field_4']; 
    }else{ 
     return ['field_1','field_3']; 
    } 
} 

надежды работает для вас

1

В соответствии с этим руководством: http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

первого набора ваших сценариев вашей модели. Пример:

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]); 
    ... 
} 

, что должен это сделать.

Смежные вопросы