Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用CamelCase操作名称时的Yii2路由_Php_Yii_Url Routing_Yii2 - Fatal编程技术网

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

Php 使用CamelCase操作名称时的Yii2路由,php,yii,url-routing,yii2,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 functio

如果有,请说出以下控制器结构

<?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
    }
}

我也对这一变化感到有些困惑,但最终我发现它使URL更容易阅读。我不确定在Yii1中是否有区分大小写的路由,在Yii2中,我不再有这个问题(或问题的印象)

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

当我用yii2重写应用程序时,我将需要维护的所有旧路由都放在url管理器中

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

            ],
        ],

所以我的旧链接现在可以正常工作了。如果您想从旧路由转到新路由,还可以在.htaccess中加入301重定向,以保持SEO的活力。

您可以创建自己的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;
}

感谢Mikhai,SEO是有意义的,在旧项目中有数百个操作,手动重新路由每个操作似乎都是cubersome一个基于正则表达式的解决方案也许是可能的?你可以编写一个自定义URL管理器来管理所有操作:)。我个人没有编写一个,因为我的项目很容易处理,公共部分不是那么大,管理员我并不真正关心搜索引擎优化。