Задать вопрос

Почему в Yii2 нельзя использовать CamelCase в названии action?

В yii2 почему-то было принято решение строго ограничить именование action в виде "action", "camel-case-action",
https://github.com/yiisoft/yii2/issues/289
И чтобы изменить это нужно в своем базовом контроллере переопределить метод createAction
https://github.com/yiisoft/yii2/commit/d8bc962cabe...
Что достаточно стремно, так как при обновлении зависимостей весь код может перестать работать.
Особенно странно это выглядит при разработке Rest Api.
/auth/sign-in
/entity/move-to-group
  • Вопрос задан
  • 5542 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Zohei
Это было сделано ради сео.
Однако, самому пришлось напрячься при переносе проекта с yii1 на yii2.
Нагуглить решения не вышло, поэтому выкладываю свой быстрый костыль.
Я просто в нужном мне контроллере переопределил метод createAction добавив в регулярку верхний регистр:
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 \yii\base\InlineAction($id, $this, $methodName);
                }
            }
        }
        return null;
    }

Оригинальный метод по ссылке https://github.com/yiisoft/yii2/blob/master/framew...

Благо у меня CamelCase был в некритичных для сео местах типа апи или личный кабинет, поэтому на возможные проблемы с сео пофиг.
Ответ написан
Комментировать
@lebedyncrs
Скорее всего это такой мини баг, который разработчики еще не поправили. Но в дальнеших версия думаю исправят
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы