Подтвердить что ты не робот

Маршрутизация Yii2 при использовании имен действий CamelCase

Если вы скажете следующую структуру контроллера

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

Есть ли способ разрешить маршрутизацию с использованием структуры camelCase в Yii2, предпочтительно, без расширения классов маршрутизации?

Это важно, так как он нарушает всю совместимость обратной связи (что, конечно, по всему Интернету), и поэтому приложение Yii1.x никогда не может быть перенесено на Yii2.x, даже если код полностью переписан. В чем причина этих изменений?

4b9b3361

Ответ 1

Я тоже немного расслышал об этом изменении, но в итоге нашел, что URL-адрес легче читать. Я не был уверен в том, что у меня есть чувствительный к регистру маршрут в Yii1, в Yii2. У меня больше нет этой проблемы (или впечатления от проблемы).

Я не уверен в конкретной причине, но могу сказать, что для SEO лучше иметь - разделение слов вместо одного большого слова.

Когда я переписал приложение в yii2, я включил в менеджер URL всех старых маршрутов, которые мне нужно поддерживать.

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

            ],
        ],

Итак, мои старые ссылки работают сейчас прекрасно. Вы также можете переадресовать 301 в .htaccess, если хотите, чтобы старые маршруты были новыми, чтобы сохранить сок SEO.

Ответ 2

Вы можете создать собственный 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;
}