2015-09-19 55 views
5

我可以在Yii2模型頁面(http://www.yiiframework.com/doc-2.0/yii-base-model.html)中看到,在「字段」部分可以根據某些上下文信息設置「不同的字段列表,例如,根據$ scenario或當前應用程序的權限用戶,您可能會返回不同的可見字段集或過濾掉某些字段。「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),但是我怎麼能說這些方法使用不同的字段集合(取決於不同的場景)?

我需要的是爲actionIndex(項目列表)輸出field1,field2,field3,但我想爲actionView(項目列表)輸出field1,field2,field3,field4。

+0

不知道,從來沒有用過其餘的api ...從你的模型類派生,引入場景(也許規則),然後重寫字段()?在控制器中,您必須在每個操作中在模型上設置場景(即,您必須覆蓋默認實現)。在字段中,您可以決定爲隱式toArray()調用啓用哪些屬性。無論如何,這對你有用嗎? – robsch

回答

0

你在你的模型中做它。

Yii2中默認的REST實現將只包含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'], 
    ]; 
} 
現在

在你的行動(S)剛剛設置的場景是這樣的:

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

應該這樣做。

相關問題