【问题标题】:Controller action with params returns 404 not found带参数的控制器操作返回 404 未找到
【发布时间】:2013-10-26 02:46:48
【问题描述】:

我正在使用 Yii,我有一个名为 User 的控制器和一些用于 CRUD 操作的操作。我添加了一个新动作如下:

public function actionEmbedded($field, $action, $id){
    /* code */
}

要访问此操作,url 应该是

/user/embedded/field/logins/action/view/id/5542ab0cb0db0ab000000001

但这会返回一个404 Not found error

但是当我将其中一个参数更改为 $_id 而不是 $id ...

public function actionEmbedded($field, $action, $_id){
    /* code */
}

...可以像预期的那样访问操作

/user/embedded/field/logins/action/view/_id/5542ab0cb0db0ab000000001

任何想法为什么?是否保留了我的任何参数名称?我确实在其他操作中使用了$id,如果这可能是导致这种行为的原因的话。

更新: 这是我的 config.php 文件中的 urlManager 代码。

    'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName'=> false,
        'rules'=>array(
            // Handles differen API versions
            'api/1.0/<action:\w+>/*' => 'api_1_0_/<action>',
            array('api_1_1_/<action>', 'pattern'=>'api/1.1/<action:\w+>', 'verb' => 'GET'),
            //array('api_1_1_/Post<action>', 'pattern'=>'api/1.1/<action:\w+>/*', 'verb' => 'POST'),

            // User specific API calls (starts with users/me)
            array('api_1_1_/prices', 'pattern'=>'api/1.1/prices/<market:\w+>/<biddingArea:\w+>/hour/<period:\w+>', 'verb' => 'GET'),
            array('api_1_1_/view/model/users/id/me', 'pattern'=>'api/1.1/users/me', 'verb' => 'GET'),
            array('api_1_1_/listEmbeddedArray/model/users/id/me/array/contracts', 'pattern'=>'api/1.1/users/me/meters', 'verb' => 'GET'),
            array('api_1_1_/view/model/units/id/<id>', 'pattern'=>'api/1.1/users/me/meters/<id:\w+>', 'verb' => 'GET'),
            //array('api_1_1_/viewEmbeddedArray/model/users/id/me/array/contracts/ean/<ean>', 'pattern'=>'api/1.1/users/me/meters/<source:\w+>/<ean:\w+>', 'verb' => 'GET'),
            //array('api_1_1_/series', 'pattern'=>'api/1.1/users/me/meters/<source:\w+>/<ean:\w+>/series/<query:\w+>', 'verb' => 'GET'),
            //array('api_1_1_/series/source/<source>/ean/<ean>/resolution/<resolution>/query<query>', 'pattern'=>'api/1.1/users/me/meters/<source:\w+>/<ean:\w+>/series/<resolution:\w+>/<query:\w+>', 'verb' => 'GET'),
            //array('api_1_1_/view/model/unit/id/<id>', 'pattern'=>'api/1.1/users/me/meters/<id:\w+>', 'verb' => 'GET'),
            array('api_1_1_/series/id/<id>', 'pattern'=>'api/1.1/users/me/series/<id:\w+>', 'verb' => 'GET'),

            array('api_1_1_/list', 'pattern'=>'api/1.1/users/me/<model:\w+>', 'verb' => 'GET'),
            array('api_1_1_/view', 'pattern'=>'api/1.1/users/me/<model:\w+>/<id:\w+>', 'verb' => 'GET'),
            array('api_1_1_/delete', 'pattern'=>'api/1.1/users/me/<model:\w+>/<id:\w+>', 'verb' => 'DELETE'),

            // General API calls
            array('api_1_1_/download', 'pattern'=>'api/1.1/download/<model:\w+>', 'verb' => 'GET'),
            array('api_1_1_/series', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>/series', 'verb' => 'GET'),

            array('api_1_1_/listEmbeddedArray', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>/<array:\w+>', 'verb' => 'GET'),
            array('api_1_1_/updateEmbeddedArray', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>/<array:\w+>/<ean:\w+>', 'verb' => 'PUT'),
            array('api_1_1_/deleteEmbeddedArray', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>/<array:\w+>/<ean:\w+>', 'verb' => 'DELETE'),
            array('api_1_1_/viewEmbeddedArray', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>/<array:\w+>/<ean:\w+>', 'verb' => 'GET'),
            array('api_1_1_/createEmbeddedArray', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>/<array:\w+>', 'verb' => 'POST'),

            array('api_1_1_/list', 'pattern'=>'api/1.1/<model:\w+>', 'verb' => 'GET'),

            array('api_1_1_/view', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>', 'verb' => 'GET'),
            array('api_1_1_/update', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>', 'verb' => 'PUT'),
            array('api_1_1_/delete', 'pattern'=>'api/1.1/<model:\w+>/<id:\w+>', 'verb' => 'DELETE'),
            array('api_1_1_/create', 'pattern'=>'api/1.1/<model:\w+>', 'verb' => 'POST'),

        ),
    ),

【问题讨论】:

  • 你似乎在使用 url manager 之类的,否则你的 url 看起来像/index.php?r=user/embedded&amp;id=5542ab0cb0db0ab000000001。您如何使用该类型的 url 访问您的操作?
  • 是的,我使用 urlManager。我试图关闭它并使用/index.php?r=user/embedded&amp;id=525ec506df6232341c000033&amp;field=logins&amp;action=view,但它导致了同样的问题......
  • 能否请您发布 urlmanager 代码?
  • 我用 urlmanager 代码更新了我的问题。

标签: php yii controller http-status-code-404


【解决方案1】:

我无法发表评论,因此即使不是,我也会将其发布为答案;检查您的 urlManager 规则,您的 urlManager 规则中可能有一个模式适合您的请求,并且框架会尝试执行它。如果我没记错的话,视图的默认规则需要参数$id,因此,您的应用程序可能会或可能不会尝试调用不存在的userController::actionView($id),因为您的应用程序中的规则看起来像'&lt;controller:\w+&gt;/&lt;id:\d+&gt;'=&gt;'&lt;controller&gt;/view'配置。

但这只是一个猜测,我建议你打开调试并检查应用程序试图去哪里。您可能可以通过在 urlManager 配置中将视图规则更改为模块/控制器/视图而不是控制器/视图来解决此问题。

干杯。

【讨论】:

  • 这是一个好点!我检查了我的 urlManager 规则,但它们都以“api/1.1/...”开头,所以猜想它们不应该影响任何以“user/...”开头的请求?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多