Добавление нового действия в REST-controller

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Добавление нового действия в REST-controller

Сообщение long399 »

Всех приветствую.

У меня есть REST-controller для работы с диссертационными советами, который отнаследован от \yii\rest\ActiveController.

Помимо стандартных CRUD-операций (метод actions()), я бы хотел использовать несколько своих операций, например, прекращение деятельности диссертационного совета.
Т.е. я хочу прописать в контроллере такой action:

Код: Выделить всё

public function actionStop($id)
{
    $model = $this->findModel($id);

    if ($model->status === $this->modelClass::STATUS_STOPED) {
        throw new UnprocessableEntityHttpException(
            "Невозможно выполнить данное действие, т.к. деятельность диссертационного совета <b>$model->code</b> уже прекращена."
        );
    } else {
        $result = $model->updateAttributes(['status' => $this->modelClass::STATUS_STOPED]);
        if ($result === 0) {
            throw new ServerErrorHttpException('Не удалось прекратить деятельность диссертационного совета по неизвестной причине.');
        }
        Yii::$app->getResponse()->setStatusCode(204);
    }
}
Я не совсем уверен, какой метод требуется привязать к этому действию? Я думаю, что PUT, PATCH. Правильно ли это?
Делаю это так:

Код: Выделить всё

protected function verbs()
{
    $verbs = parent::verbs();

    $verbs['stop'] = ['PUT', 'PATCH'];

    return $verbs;
}
В конфиге прописываю такое правило для urlManager:

Код: Выделить всё

[
    'class' => yii\rest\UrlRule::class,
    'controller' => 'v1/dissertation-council',
    'pluralize' => false,
    'extraPatterns' => [
        'PUT,PATCH <id:\d+>/stop' => 'stop',
    ]
]
Но метод не работает... Пробую к нему обратиться вот так:

Код: Выделить всё

$client = new \GuzzleHttp\Client();

// hostname и access-token изменены
$url = "hostname/v1/dissertation-council/1/stop?access-token=qwerty";

try {
    $res = $client->request(
        'PUT',
        $url
    );
} catch() {
...
}
Происходит ошибка:
GuzzleHttp\Exception\ClientException
Client error: `PUT hostname/v1/dissertation-council/1/stop?access-token=qwerty` resulted in a `404 Not Found` response
Не понимаю, что я делаю не так?
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Добавление нового действия в REST-controller

Сообщение long399 »

Разобрался, поторопился с вопросом... Ошибся в hostname. Использовал prod URL, вместо dev.

Но вопрос все равно актуален. Правильно ли я добавил данное действие, правильно ли переопределил метод verbs()?
Ответить