使用CamelCase操作名称时的Yii2路由

时间:2014-09-06 05:23:08

标签: php yii url-routing yii2

如果你说了以下控制器结构

<?php
namespace app\controllers;

use Yii;
use yii\web\Controller;
/**
 * Test controller
 */
class TestController extends Controller
{
    public function actionMyaction(){
       ...
       //action logic
    }

    public function actionMyAction(){
       ... 
      //action logic
    }
}

可以使用路径example.com/test/myaction

访问第一个路径

每条Yii 1.x逻辑的第二条路径应该可以从路径example.com/test/myAction访问 在Yii2.x中,路由使用带连字符的结构,只能从example.com/test/my-action

访问

有没有在Yii2中使用camelCase结构启用路由,最好不使用路由类扩展?

这很重要,因为它打破了所有链接(当然是互联网上的所有链接)向后兼容性,因此即使代码被完全重写,Yii1.x应用也永远无法迁移到Yii2.x.这种变化的原因是什么?

2 个答案:

答案 0 :(得分:13)

我对这个改变也有点担心,但最终我发现它使URL更容易阅读。我不确定在Yii1中有一个区分大小写的路线,在Yii2中我不再有这个问题(或问题的印象)。

我不确定确切的原因,但我可以告诉你,对于搜索引擎优化最好是 - 分隔单词而不是一个大词。

当我在yii2中重写了一个应用程序时,我在url manager中输入了我需要维护的所有旧路由。

        'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
.................................................
                'site/registerInterest' => 'site/register-interest',
.................................................

            ],
        ],

所以我的旧链接现在工作得很好。你也可以在.htaccess中放置一个301重定向,如果你想从旧路由到新路由以保持SEO汁液。

答案 1 :(得分:3)

您可以创建自己的Basecontroller并覆盖createAction 使用模式允许大写,如

preg_match('/^[a-zA-Z0-9\\-_]

 public function createAction($id)
{
    if ($id === '') {
        $id = $this->defaultAction;
    }

    $actionMap = $this->actions();
    if (isset($actionMap[$id])) {
        return Yii::createObject($actionMap[$id], [$id, $this]);
    } elseif (preg_match('/^[a-zA-Z0-9\\-_]+$/', $id) && strpos($id, '--') === false && trim($id, '-') === $id) {
        $methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $id))));
        if (method_exists($this, $methodName)) {
            $method = new \ReflectionMethod($this, $methodName);
            if ($method->isPublic() && $method->getName() === $methodName) {
                return new InlineAction($id, $this, $methodName);
            }
        }
    }

    return null;
}