2015-06-25 1 views
1

Я создаю приложение RESTful в Yii2, и я заменил метод fields() в модели (расширение ActiveRecord), но я хочу определить, какие поля будут возвращены, в зависимости от того, был ли запрос просмотрен или переименован.Как вернуть поля в зависимости от действия RESTful?

В контроллере легко проверить, какое действие RESTful используется, сбросив переменную $ actions в методе действий. Как я могу сделать что-то подобное в модели? Я попытался проверить сценарий, но, конечно, это default.

ответ

2

Существует несколько способов, я опишу два из них.

1) Очень просто и просто: позвоните \Yii::$app->controller->action->uniqueId в методе вашей модели fields(), чтобы определить, какое действие используется.

2) По вашему комментарию, ActionController определяют свои действия в actions метод, который возвращает массив действий и их конфигураций, например, для зрения действий:

'view' => [ 
    'class' => 'yii\rest\ViewAction', 
    'modelClass' => $this->modelClass, 
    'checkAccess' => [$this, 'checkAccess'], 
], 

так в вашем контроллере ребенка вы можете переопределить реализацию родительской и установить классы действий для каждого действия, например:

public function actions() 
{ 
    $myActions = [ 
     'view' => [ 
      'class' => 'app\actions\MyViewAction', 
     ] 
    ]; 
    return ArrayHelper::merge(parent::actions(), $myActions); 
} 

Здесь app\actions\MyViewAction вашего пользовательского класса действия, вы можете наследовать от yii\rest\Action и переопределить метод run().

public function run($id) 
{ 
    $model = $this->findModel($id); 
    if ($this->checkAccess) { 
     call_user_func($this->checkAccess, $this->id, $model); 
    } 
    $model->scenario = 'view'; 
    return $model; 
} 

, а затем проверить сценарий в вашей модели и выполнить соответствующие действия. Надеюсь, это поможет

+0

Я должен был уточнить и упомянуть, что контроллер расширяет ActiveController. В этом случае я не определяю никаких действий и поэтому не могу установить сценарий. – Dubby

+0

Спасибо, точка 1 именно то, что я искал. – Dubby