Yii2 Переопределить общий создать действие в Rest ActiveController

У меня есть Rest API в Yii2, и Yii генерирует все действия

просмотр/обновление/создание/удаление

Я хочу изменить comportement createMethode et garde на другие методы, поэтому я не могу использовать класс Controller, я должен использовать класс ActiveController

Но я хочу, чтобы этот класс выполнял ту же работу, мне нужно добавить некоторые действия перед созданием и некоторые действия после создания. Поэтому мне нужно переопределить actionCreate

как мне это сделать?

Ответ 1

Вы можете сделать следующее

class CountryController extends ActiveController
{
    public $modelClass = 'common\models\Country';

    public function actions()
    {
        $actions = parent::actions();
        unset($actions['create']);
        return $actions;
    }

    public function actionCreate(){
        // implement here your code

    }

}

Ответ 2

Я знаю, что это старый вопрос; но я нашел его в соответствующем поиске и думал, что могу предоставить хорошее, обновленное решение и резюме того, что здесь сейчас. Надеюсь, кто-то найдет это полезным...

Я знаю два способа сделать это. Вы можете определить метод действия, например, упомянутый @Roman Podlinov, или вы можете определить действие как отдельный класс и указать ему действие по умолчанию, близкое к тому, что упоминалось в @mrJ0ul3. Я приведу примеры обоих ниже для полноты.

Метод 1 - метод действия в контроллере

В контроллере переопределите метод actions следующим образом:

public function actions()
{
    $actions = parent::actions();
    unset($actions['create']);
    return $actions;
}

И затем вы можете определить свой метод создания в этом контроллере.

public function actionCreate()
{
    // your code goes here
}

И чтобы быть ясным, имя метода должно быть actionCreate как показано выше. Я видел комментарий, упоминающий createAction, но это неверно. Они могут запутаться с классом CreateAction который является частью пространства имен yii\rest и содержит код, который на самом деле выполняется с действием по умолчанию REST. Однако, если вы используете этот метод для переопределения логики запроса создания, то этот класс не имеет большого значения. Это имеет значение, хотя для другого метода...

Метод 2 - отдельный класс действия

Лично я предпочитаю и использую этот метод, чтобы переопределить действия по умолчанию. Мне нравится поддерживать логику действия CRUD по умолчанию вне самого контроллера. Это приятно знать, что если в моем контроллере есть методы действий, они полностью настраиваются. Это, безусловно, только личное предпочтение.

Для этого вы создадите новый файл класса, который должен содержать код, который выглядит примерно так:

namespace app\actions\controllerName

class CreateAction extends \yii\rest\CreateAction
{
    public function run()
    {
        // your code goes here
    }
}

Если вы пройдете этот маршрут, я бы рекомендовал проверить тело класса Yii REST CreateAction и моделировать прогрессию вашего кода после их использования, предполагая, что имеет смысл сделать это для вашего случая использования.

Теперь вам просто нужно сказать контроллеру использовать этот класс действий для действия create. Вы делаете это в методе действий контроллера следующим образом:

public function actions()
{
    $actions = parent::actions();
    $actions['create']['class'] = 'app\actions\controllerName\CreateAction';
    return $actions;
}

Как вы можете видеть, в синтаксисе аналогично тому, что предлагал @mrJ0ul3; но это предложение изменило только то, как одна часть одного действия будет работать. Это не позволяет полностью отменить логику действия - вот почему он пропустил отметку при ответе на фактический вопрос.

Надеюсь, это поможет!

-Cheers всех! :)

Ответ 3

Или вы можете сделать это, выполнив следующий шаг:

public function actions() {
    $actions = parent::actions();
    // will overriding return data on the index action
    $actions['index']['prepareDataProvider'] = [new app/models/Post(), 'getAllPost'];
    return $actions;
}