2015-09-19 16 views
5

Tôi có thể thấy trong trang mô hình Yii2 (http://www.yiiframework.com/doc-2.0/yii-base-model.html), trong phần "trường" mà bạn có thể đặt "danh sách trường khác nhau dựa trên một số thông tin ngữ cảnh. Ví dụ: tùy thuộc vào kịch bản $ hoặc đặc quyền của ứng dụng hiện tại người dùng, bạn có thể trả về các nhóm trường hiển thị khác nhau hoặc lọc ra một số trường ".Yii2: Tôi có thể sử dụng các tình huống để chỉ định các trường mô hình khác nhau cho các hành động khác nhau không?

Nhưng, tài liệu về kịch bản (http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios) cho biết các trường hợp là tạo ngữ cảnh khác nhau để xác thực thuộc tính mô hình.

Tôi đang sử dụng API yên tĩnh Yii2, nơi tôi phải sử dụng các tác vụ mặc định (actionIndex, actionView, ...) để lấy dữ liệu từ mô hình và hiển thị dưới dạng kết quả API. Tôi biết tôi có thể ghi đè lên các phương pháp đó (http://www.yiiframework.com/doc-2.0/guide-rest-controllers.html#extending-active-controller), nhưng làm cách nào tôi có thể nói trong các phương pháp đó để sử dụng các nhóm trường khác nhau (tùy thuộc vào các tình huống khác nhau)?

Điều tôi cần là xuất trường 1, trường 2, trường 3 cho actionIndex (danh sách các mục), nhưng tôi muốn xuất trường 1, trường 2, trường 3, trường4 cho actionView (danh sách mục).

+0

Không chắc chắn, không bao giờ sử dụng phần còn lại api ... Có nguồn gốc từ bạn lớp mô hình, giới thiệu kịch bản (và có thể quy tắc) và sau đó ghi đè các lĩnh vực()? Trong bộ điều khiển, bạn sẽ phải đặt kịch bản trên mô hình trong mỗi hành động (nghĩa là bạn phải ghi đè lên các cài đặt mặc định). Trong các trường, bạn có thể quyết định các thuộc tính nào sẽ được kích hoạt cho cuộc gọi toArray() ngầm định. Điều này làm việc cho bạn dù sao đi nữa? – robsch

Trả lời

0

Bạn làm điều đó trong mô hình của mình.

Triển khai REST mặc định trong Yii2 sẽ chỉ bao gồm các thuộc tính được trả về theo phương thức fields(). Theo mặc định, phương thức đó trả về tất cả các thuộc tính. Do đó, bạn xác định nó như sau:

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

Ngoài ra, bạn có phương thức scenarios() tùy ý, trả về tất cả các thuộc tính đang hoạt động cho một trường hợp nhất định.

Đừng quên đặt kịch bản mô hình trong bộ điều khiển của bạn.

0

đây là giải pháp của tôi cho vấn đề này, sử dụng Yii :: app $() công trình

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

hy vọng cho bạn

1

Theo hướng dẫn này: http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

đầu tiên thiết lập các kịch bản của bạn trong mô hình của bạn. Ví dụ:

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

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

bây giờ trong hành động của bạn (s) chỉ cần thiết lập các kịch bản như thế này:

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

rằng nên làm điều đó.

Các vấn đề liên quan