Yii2 UrlManager REST API 提供 id 参数时出现 GET 404 错误

Yii2 UrlManager REST API GET 404 error when giving id parameter

我用 Yii2 基本模板制作了一个 REST API。我对 webconfig 做了一些更改,因此我可以使用像 web/users 和 web/users/1 这样的链接。它工作正常,但我无法再访问 web/index。所以我向 UrlManager 添加了更多规则。

'urlManager' => [
        'enablePrettyUrl' => true,
        'enableStrictParsing' => true,
        'showScriptName' => false,
        'rules' => [
            //basic/web
            '<controller:\w+>/<id:\d+>' => '<controller>/view',
            '<controller:[\w\-]+>/<action:[\w\-]+>/<id:[\d]+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',


            //basic/web/users
            ['class' => 'yii\rest\UrlRule', 'controller' => ['user', 'car']],
            //basic/web/countries
            //Id is een string, vandaar de tokens
            ['class' => 'yii\rest\UrlRule', 'controller' => 'country', 'tokens' => ['{id}' => '<id:\w+>']],
        ],
    ],

通过上面的代码我可以访问web/index。我还可以访问 web/users 来获取用户列表。但我无法访问 web/users/1。它给出了 404 错误。

编辑:

'urlManager' => [
        'enablePrettyUrl' => true,
        'enableStrictParsing' => true,
        'showScriptName' => false,
        'rules' => [
            //basic/web
            /*
            '<controller:\w+>/<id:\d+>' => '<controller>/view',
            '<controller:[\w\-]+>/<action:[\w\-]+>/<id:[\d]+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            */



            //basic/web/users
            ['class' => 'yii\rest\UrlRule', 'controller' => ['user', 'car', 'site']],
            //basic/web/countries
            //Id is een string, vandaar de tokens
            ['class' => 'yii\rest\UrlRule', 'controller' => 'country', 'tokens' => ['{id}' => '<id:\w+>']],
        ],
    ],

我改成这样了。现在我可以访问 web/sites 因为复数化。 但是如果我去 web/sites/about 例如,它会再次给出 404 错误。所以这不是最好的解决方案

我认为在同一个配置文件中维护 REST API 和 HTML 网页并不容易。例如,根据 REST 的无状态特性,cookie 和会话通常被禁用,而您可能需要在经典 HTML 页面中对用户进行身份验证。

我建议修改您的应用程序结构并将您的 REST API 作为独立的 module with its own routing configuration and maybe its own Entry Script 实施,而不会丢失 web 条目。

更好的结构可能如下所示:(来自下面链接的教程)

+ web
+ config
+ controllers
...
+ api
  + config
  + modules
    + v1
      + controllers
  .htaccess
  index.php

然后您将能够在 web/sites/about 中打开您的 HTML 文件,同时在 api/users/1 中检索您的资源。每个条目可以拥有自己的 controllers 和自己的 models,或者它们可以共享 @app/models。查看此分步教程以了解如何实现它:

Creating a REST API for Yii2-basic-template - by Joachim Werner

您还可以检查 this app 中的 apiauth 文件夹,它们都是独立的 REST APIs。