Дополнительные шаблоны Yii2 Rest API с несколькими контроллерами

У меня есть 2 контроллера в моем API. Для каждого из них определены дополнительные шаблоны. Все мои действия работают правильно, кроме входа пользователя, который определяется в дополнительных шаблонах.

<?
'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => [ 'v1/item', 'v1/user'], 
            'tokens' => [
                '{id}' => '<id:\\w+>', //commenting out this token allows login to return
                '{type}'=>'<type:\\w+>'
            ],
            'extraPatterns' => [
                'POST {id}/image/{type}' => 'image', //from the item controller
                'GET login' => 'login' // from the USER controller
            ]
        ]

    ],
],

ошибки пользователя/логина как таковые. Обратите внимание, что он ищет действие v1/user/view.

 {
    "name": "Not Found",
    "message": "Page not found.",
    "code": 0,
    "status": 404,
    "type": "yii\\web\\NotFoundHttpException",
    "previous": {
        "name": "Invalid Route",
        "message": "Unable to resolve the request: v1/user/view",
        "code": 0,
        "type": "yii\\base\\InvalidRouteException"
    }
}

Если я закомментирую токен идентификатора в urlManager, действие пользователя/входа будет работать, но другие мои маршруты завершатся ошибкой.


person robr    schedule 21.04.2015    source источник


Ответы (2)


Решается разделением правил на элемент для каждого контроллера:

[
    'class' => 'yii\rest\UrlRule',
    'controller' => 'v1/config', //, 
    'tokens' => [
        '{id}' => '<id:\\w+>',
        '{type}'=>'<type:\\w+>'
    ],
    'extraPatterns' => [
        'POST {id}/image/{type}' => 'image',
    ]
],

[
    'class' => 'yii\rest\UrlRule', 
    'controller' => 'v1/user', 
    'extraPatterns' => [
        'GET login' => 'login'
    ],
] 
person robr    schedule 22.04.2015

Когда вы указываете токены

'{id}' => '<id:\\w+>',

вы переопределяете токены yii\rest\UrlRule по умолчанию

'{id}' => '<id:\\d[\\d,]*>',

и просмотреть начало маршрута, перевести в следующее

'GET,HEAD {id}' => 'view',
/user/<id:\\w+>

где id - это слово, поэтому /user/login преобразуется в действие просмотра

person radzserg    schedule 14.01.2016