Маршрутизация 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, даже если код полностью переписан. Что послужило причиной этого изменения?


person Manquer    schedule 06.09.2014    source источник


Ответы (2)


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

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

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

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

            ],
        ],

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

person Mihai P.    schedule 15.09.2014
comment
Спасибо, Михай, SEO имеет смысл, в старом проекте сотни действий, ручное перенаправление каждого из них кажется громоздким, возможно, возможно решение на основе регулярных выражений? - person Manquer; 15.09.2014
comment
Вы можете написать 1 собственный менеджер URL-адресов yiiframework.com/doc-2.0/, который мог бы управлять ими всеми :). Лично я не писал ни одного, так как мой проект был легко управляемым, публичная часть не такая уж большая, а администратором я занимаюсь. на самом деле не заботятся о SEO. - person Mihai P.; 16.09.2014

Вы можете создать свой собственный 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;
}
person Jörg Peters    schedule 02.02.2016