ArtyomovAnton
@ArtyomovAnton
PHP и всё что рядом

Как настроить yii2 rest routing?

Здравствуйте. Читаю Гайд yii2 RESTful Routing, но не получается, что бы работало на практике. Я пытаюсь, в зависимости от verb (HTTP Глагола), отработать соответсвующий экшн device контроллера, который находится в модуле api и наследуется от yii\rest\Controller. Мой urlManager выглядит так
'urlManager'   => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => false,
            'showScriptName'  => false,
            'rules'           => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => 'api\device',
                ],
                //'GET api/device' => 'api/device/index',
                //'POST api/device' => 'api/device/create',
                '<module:[\w-]+>/<controller:[\w-]+>/<action:[\w-]+>/<id:\d+>' => '<module>/<controller>/<action>',
                'api/search-dev/<serilal:[\w-]+>' => 'api/search-dev',
                'api/dev-models/type/<type_id:\d+>/brand/<brand_id:\d+>' => 'api/dev-models',
            ],
        ],

Контроллер выглядит так
namespace app\modules\api\controllers;

use yii\rest\Controller;

class DeviceController extends Controller {

    public function actionIndex() {
        $resp = new \stdClass();
        $resp->action = 'index';
        return $resp;
    }

    public function actionCreate() {
        $resp = new \stdClass();
        $resp->action = 'create';
        return $resp;
    }
}

Не зависимо от передаваемого verb (POST или GET) у меня всегда отрабатывает actionIndex device контроллера.
В коде urlManager видно, что я пытался писать правила, типа 'POST api/device' => 'api/device/create'. Безуспешно.
Кто нибудь понимает, как это работает? Можете объяснить «популярно»? Спасибо.
  • Вопрос задан
  • 4209 просмотров
Решения вопроса 1
ArtyomovAnton
@ArtyomovAnton Автор вопроса
PHP и всё что рядом
'urlManager'   => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName'  => false,
            'rules'           => [
                'GET api/device' => 'api/device/index',
                'POST api/device' => 'api/device/create',
                '<module:[\w-]+>/<controller:[\w-]+>/<action:[\w-]+>/<id:\d+>' => '<module>/<controller>/<action>',
                'GET api/search-dev/<serilal:[\w-]+>' => 'api/search-dev',
                'GET api/dev-models/type/<type_id:\d+>/brand/<brand_id:\d+>' => 'api/dev-models',
                '<module:[\w-]+>/<controller:[\w-]+>' => '<module>/<controller>',
            ],
        ],

Работает при 'enableStrictParsing' => true без extraPatterns. Спасибо за ответ.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
EnChikiben
@EnChikiben
у вас первое правило все обрабатывает, в том же гайде который вы используете есть пример:
[
    'class' => 'yii\rest\UrlRule',
    'controller' => 'user',
    'extraPatterns' => [
        'GET search' => 'search',
    ],
]

в вашем случае должно быть, что то типа должно быть:
[
    'class' => 'yii\rest\UrlRule',
    'controller' => 'api\device',
    'extraPatterns' => [
        'POST create' => 'create',
    ],
]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы