Контроллер в субкаталоге

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Контроллер в субкаталоге

Сообщение Stepan Selyuk »

Приветствую!

Имеется контроллер в @app/modules/admin/controllers/authAssignment/FlexiController.php

Как к нему обратиться? /admin/authAssignment/flexi/index не работает, /admin/auth-assignment/flexi/index тоже не работает. Работает, если каталог authAssignment переименовать в authassignment и вызывать как /admin/authassignment/flexi/index, но тогда получается некрасиво)

В UrlRules такое правило на этот счет:

Код: Выделить всё

'<controller:[\w-\/]+>/<action[\w-]+>' => '<controller>/<action>',
 
Сначала невидимое, затем видимое. И так у всех программистов :)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Контроллер в субкаталоге

Сообщение zelenin »

как мне кажется, вы не совсем следуете стандарту PSR - authAssignment должно быть AuthAssignment и соответственно /admin/auth-assignment/flexi/index будет работать.
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Контроллер в субкаталоге

Сообщение Stepan Selyuk »

Попробовал и так:

@app/modules/admin/controllers/AuthAssignment/FlexiController.php
Unable to resolve the request "admin/auth-assignment/flexi/index".

Неймспейс в контроллере тоже разумеется поправил:

Код: Выделить всё

namespace app\modules\admin\controllers\AuthAssignment;
Собственно из документации:
The followings are some examples, assuming the controller namespace takes the default value app\controllers:

article derives app\controllers\ArticleController;
post-comment derives app\controllers\PostCommentController;
admin/post-comment derives app\controllers\admin\PostCommentController;
adminPanels/post-comment derives app\controllers\adminPanels\PostCommentController.
У меня последний случай, вот только с использованием модуля.
Сначала невидимое, затем видимое. И так у всех программистов :)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Контроллер в субкаталоге

Сообщение zelenin »

да, странно. продебажьте.
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Контроллер в субкаталоге

Сообщение Stepan Selyuk »

Кажется нашел ошибку в @app/vendor/yiisoft/yii2/base/Module.php,
в методе:

Код: Выделить всё

public function createControllerByID($id)
    {
        if (!preg_match('%^[a-z0-9\\-_/]+$%', $id)) {
            return null;
        }
    //...
    }
Метод выкидывает сразу null, не поддерживая буквы в верхнем регистре, и далее он не производит замену "-", так же как это производится с классом контроллера. Поэтому нужно либо добавить модификатор "i" к регулярке, либо переписать код так, чтобы переменная $prefix обрабатывалась также как и переменная $class.

Запилю PR.
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Контроллер в субкаталоге

Сообщение Stepan Selyuk »

Ага, судя по коду в master это уже поправлено:

Код: Выделить всё

 if (!preg_match('%^[a-z][a-z0-9\\-_]*$%', $className)) {
        return null;
}
if ($prefix !== '' && !preg_match('%^[a-z0-9_/]+$%i', $prefix)) {
        return null;
}
То есть, если контроллер в субкаталоге, то субкаталог в URL нужно прописывать также как он реально называется.
Последний раз редактировалось Stepan Selyuk 2014.09.14, 16:00, всего редактировалось 1 раз.
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Контроллер в субкаталоге

Сообщение Stepan Selyuk »

@zelenin, кстати в другом топике читал, что вы строго за datetime в MySQL при хранении даты и времени. Почему? Я например использую int(11) unsigned, но подумываю использовать bigint(20) чтобы хранить количество миллисекунд от Epoch, вместо секунд. Считаю что DB не должна заниматься часовыми поясами, это лишь место хранения. И если в приложении используются часовые пояса, то лучше чтобы хранилось это в UTC unix timestamp в базе.
Последний раз редактировалось Stepan Selyuk 2014.09.14, 16:05, всего редактировалось 1 раз.
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
MetaDriver
Сообщения: 43
Зарегистрирован: 2014.04.21, 20:53
Откуда: Казань

Re: Контроллер в субкаталоге

Сообщение MetaDriver »

Stepan Selyuk писал(а):Приветствую!
.....
Как к нему обратиться? /admin/authAssignment/flexi/index не работает, /admin/auth-assignment/flexi/index тоже не работает. Работает, если каталог authAssignment переименовать в authassignment и вызывать как /admin/authassignment/flexi/index, но тогда получается некрасиво)
..............
Ага, плавали... "Теоретически" (согласно документации) должон работать выделенный вариант. Но таки он не работает, и я тоже с этим сталкивался. В итоге решил, что это баг (ну недоделка, скажем так), а поскольку жить нужно уже сейчас, я просто перешёл на under-нотацию для названий модулей, моделей и контроллеров, т.е. вместо привычного и приятного OneTwoThreeController (к примеру) - one_two_threeController. Это работает. Попытки же заставить работать camel-нотацию для более чем одного слова в названии успехом не увенчались. Рекомендую уведомить разработчиков о недоделке (я так и не собрался :oops: ), щёб в будущем всё заработало именно так, "как сказано в писании", а пока юзать "си"шную нотацию, как это сделал я. По крайней мере "one_two_threeController" удобнее чем "onetwothreeController" ....... :)
Последний раз редактировалось MetaDriver 2014.09.14, 16:07, всего редактировалось 1 раз.
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Контроллер в субкаталоге

Сообщение Stepan Selyuk »

CamelCase с контроллерами работает нормально, был только баг если контроллер в подкаталоге находится, и подкаталог использует camelCase. В мастере уже поправлено. Поэтому можно смело править у себя в бете, а потом когда RC выкатят, не беспокоиться об этой проблеме.
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
MetaDriver
Сообщения: 43
Зарегистрирован: 2014.04.21, 20:53
Откуда: Казань

Re: Контроллер в субкаталоге

Сообщение MetaDriver »

Stepan Selyuk писал(а):Кажется нашел ошибку в @app/vendor/yiisoft/yii2/base/Module.php,
в методе:

Код: Выделить всё

public function createControllerByID($id)
    {
        if (!preg_match('%^[a-z0-9\\-_/]+$%', $id)) {
            return null;
        }
    //...
    }
 
Метод выкидывает сразу null, не поддерживая буквы в верхнем регистре, и далее он не производит замену "-", так же как это производится с классом контроллера. Поэтому нужно либо добавить модификатор "i" к регулярке, либо переписать код так, чтобы переменная $prefix обрабатывалась также как и переменная $class.

Запилю PR.
О!! Круто. Пока я писал свой предыдущий совет, поезд уже прибыл по назначению.
Ответить