2015-09-19 44 views
5

Widzę na stronie modelu Yii2 (http://www.yiiframework.com/doc-2.0/yii-base-model.html), w sekcji "pola", które można ustawić "różne listy pól na podstawie niektórych informacji kontekstowych.Na przykład, w zależności od scenariusza $ lub przywilej bieżącej aplikacji użytkownik może zwrócić różne zestawy widocznych pól lub odfiltrować niektóre pola. "Yii2: Czy mogę używać scenariuszy do określania różnych zestawów pól modelu dla różnych działań?

Jednak dokumentacja scenariuszy (http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios) mówi, że scenariusze służą do tworzenia różnych kontekstów dla walidacji atrybutów modelu.

Korzystam z Restrykcyjnego API Yii2, gdzie muszę użyć domyślnych akcji (actionIndex, actionView, ...), aby pobrać dane z modelu i pokazać jako wyniki API. Wiem, że mogę zastąpić te metody (http://www.yiiframework.com/doc-2.0/guide-rest-controllers.html#extending-active-controller), ale jak mogę w tych metodach używać różnych zestawów pól (w zależności od różnych scenariuszy)?

To, czego potrzebuję, to wyprowadzanie pola 1, pole 2, pole 3 dla actionIndex (lista elementów), ale chcę wyprowadzić pole 1, pole 2, pole 3, pole 4 dla akcji (lista elementów).

+0

Nie jestem pewien, nigdy nie używałam api ... Wypróbuj klasę modelu, przedstaw scenariusze (i może reguły), a następnie przesłonię pola()? W kontrolerze będziesz musiał ustawić scenariusz na modelu w każdej akcji (tzn. Musisz zastąpić domyślne implementacje). W polach można następnie zdecydować, które atrybuty powinny być włączone dla niejawnego wywołania toArray(). Czy to działa w każdym razie? – robsch

Odpowiedz

0

Robisz to w swoim modelu.

Domyślna implementacja REST w Yii2 będzie uwzględniać tylko atrybuty zwracane przez metodę fields(). Domyślnie ta metoda zwraca wszystkie atrybuty. W związku z tym, można zdefiniować ją tak:

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

Również masz metodę scenarios() do Państwa dyspozycji, która zwraca wszystkie aktywne atrybuty dla danego scenariusza.

Nie zapomnij ustawić scenariusza modeli w kontrolerze.

0

to jest moje rozwiązanie tego problemu, używając Yii :: app() $ prace

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']; 
    } 
} 

dla ciebie nadzieja

1

Zgodnie z tym przewodnikiem: http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

najpierw ustawić swoje scenariusze twój model. Przykład:

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

public function scenarios() 
{ 
    return [ 
     self::SCENARIO_LESS => ['field1', 'field2'], 
     self::SCENARIO_MORE => ['field1', 'field2', 'field3'], 
    ]; 
} 

teraz w swoim działaniu (ów) wystarczy ustawić scenariusz tak:

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

że powinien to zrobić.