Yii2 路由使用 yii\rest\UrlRule 和几个参数

Mat*_*Mat 4 php rest routing yii yii2

我正在尝试将 Yii 2 路由用于 REST API。

按照http://www.yiiframework.com/doc-2.0/guide-rest-routing.html 上的教程,我已经(成功)定义了很多 API 入口点规则,如下所示:

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        [
            'class' => 'yii\rest\UrlRule', 
            'controller' => 'user'
        ],
    ],
]
Run Code Online (Sandbox Code Playgroud)

这样的规则定义:

  • GET /users(列出用户)
  • GET /users/123(显示用户 123 的详细信息)

现在,我的用户有游戏。所以我想要网址:

  • GET /users/123/games(列出用户123的游戏)
  • GET /users/123/games/864(用户123的864游戏详情——比如他的分数)

我尝试像这样定义我的新入口点(没有成功):

'rules' => [
    ... previous rules ...,
    [
        'class' => 'yii\rest\UrlRule',
        'controller' => [
            'game'
        ],
        'tokens' => [
            '{userid}' => '<userid:\\d>',
            '{gameid}' => '<gameid:\\d>',
        ],
        'patterns' => [
            'GET,HEAD /users/{userid}/games' => 'index',
            'GET,HEAD /users/{userid}/games/{gameid}' => 'view',
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

这个定义似乎是错误的,因为我收到了一个 404 Page not found 错误。我应该如何定义我的新 url 路由?我想对我的定义使用等效的格式,扩展 'yii\rest\UrlRule'

我不确定这是否可能,教程没有提到这种情况。

Mat*_*Mat 5

所以我想出了如何使用更复杂的规则。

先说解,再解释。

这是解决方案:

'rules' => [
    ... previous rules ...,
    [
        'class' => 'yii\rest\UrlRule',
        'controller' => 'game',
        'prefix' => '/users/<userid:\\d+>',
        'tokens' => [
            '{gameid}' => '<gameid:\\d+>',
        ],
        'patterns' => [
            'GET,HEAD' => 'index',
            'GET,HEAD {gameid}' => 'view',
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

现在解释:

  • 首先,我的 userid / gameid 属性定义错误。“\d”后缺少一个“+”
  • 控制器似乎被自动添加为模式的前缀。因此,您必须同时定义控制器和前缀(将在控制器之前添加)。
  • 前缀中的参数似乎没有被解析以查找标记。所以我直接在前缀中写了正则表达式,而不是添加“userid”作为标记。
  • 最后,在连接“前缀/控制器/模式”时会自动添加各种“/”,因此您不必编写一个。
  • 也不要忘记复数规则!“游戏”是单数”但有效的网址将是

    • /用户/123/游戏
    • /用户/123/游戏/789

希望它会有所帮助。