Yii没有检测到驼峰案例行动

时间:2015-08-18 09:47:40

标签: php yii yii2 camelcasing

如果我宣布这样的行动,Yii正在给我404 Error

SiteController.php

public function actionRegisterUser()

这就是我在main.php

中的称呼方式
 ['label' => 'Register User', 'url' => ['/site/RegisterUser']],

我尝试了几种不同的组合。唯一可行的组合是两个地方的命名约定:

 public function actionRegisteruser

 'url' => ['/site/registeruser']

我曾经在另一个Yii项目(Yii 1.0)上工作,我可以用驼峰的情况命名我的行为,并且没有任何问题地调用它们。 我是否需要启用某种设置才能执行此操作

我也尝试过使用控制器的rules,但这并没有解决任何问题。

2 个答案:

答案 0 :(得分:2)

在某些情况下,您需要camelcase链接。例如,用于SEO目的(保持入站链接)。您可以在Web服务器端创建重写规则,或者在应用程序端向URL管理器添加内联规则。例如:

'urlManager' => [
    'rules' => [
        '<controller:RegisterUser>/<action:\w+>'=>'register-user/<action>',
    ],
],

也可以编写自定义URL rule。例如:

namespace app\components;

use yii\web\UrlRuleInterface;
use yii\base\Object;

class CarUrlRule extends Object implements UrlRuleInterface
{

    public function createUrl($manager, $route, $params)
    {
        if ($route === 'car/index') {
            if (isset($params['manufacturer'], $params['model'])) {
                return $params['manufacturer'] . '/' . $params['model'];
            } elseif (isset($params['manufacturer'])) {
                return $params['manufacturer'];
            }
        }
        return false;  // this rule does not apply
    }

    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();
        if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {
            // check $matches[1] and $matches[3] to see
            // if they match a manufacturer and a model in the database
            // If so, set $params['manufacturer'] and/or $params['model']
            // and return ['car/index', $params]
        }
        return false;  // this rule does not apply
    }
}

使用[[yii \ web \ urlManager :: rules]]配置中的新规则类:

[
    // ...other rules...

    [
        'class' => 'app\components\CarUrlRule', 
        // ...configure other properties...
    ],
]

答案 1 :(得分:1)

您需要指定此行为['/site/register-user']。正如documentation所述关于内联操作

  

index变为actionIndexhello-world变为actionHelloWorld