Rules urlManager-а внутри модуля

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Rules urlManager-а внутри модуля

Сообщение BalykhinAS »

Можно ли как то задать маршруты модуля только при его инициализации что бы не забивать их в основные маршруты?

есть такое решение https://github.com/albertborsos/yii2-us ... hp#L18-L24

1) Модуль должен реализовывать BootstrapInterface
2) В конфиге в мы должны бутсрапить модуль
3) В самом модуле задаем нужные рулы

но выходит что маршруты модуля загружаются в любом случае
Последний раз редактировалось BalykhinAS 2018.03.09, 13:09, всего редактировалось 1 раз.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: urlManager внутри модуля

Сообщение Nex-Otaku »

1. Нет, нельзя.

Если ваше требование переложить в реальный мир, то ваш вопрос звучит примерно так. "Можно я отправлю человека в магазин, а когда он до него дойдёт, я ему скажу, в какой магазин идти?"

Если у приложения при разборе URL нет маршрутов модуля, приложение никак не узнает, что запрос должен разбирать именно этот модуль. Поэтому так работать не будет - обработка запроса просто никогда не дойдёт до модуля.

Более того, красивые ссылки вида "Url::to()" вне модуля вы тоже не сможете сгенерировать - ведь маршрутов не будет.

2.
А зачем вам это понадобилось?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: urlManager внутри модуля

Сообщение BalykhinAS »

«Я прошу человека дойти до магазина а когда он дойдёт скажу в какой отдел ему ити»

Вы ведь методы объекта создаёте в самом объекте или slug-и вы тоже прописываете в приложении для всех объектов?

Понадобилось по простой причине - хранить правила модуля внутри модуля и применять их только тогда когда в этом модуле есть потребность
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: urlManager внутри модуля

Сообщение maleks »

Wizard писал(а): 2018.03.08, 01:22 есть такое решение
Если модуль реализован как расширение, то можно бутстраписть и так, без указания модуля в 'bootstrap' приложения
Wizard писал(а): 2018.03.08, 01:22 но выходит что маршруты модуля загружаются в любом случае
Так вам же и надо чтобы в любом случае (ну в смысле кроме консоли), или о чем вы тут?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: urlManager внутри модуля

Сообщение BalykhinAS »

maleks писал(а): 2018.03.08, 11:49
Wizard писал(а): 2018.03.08, 01:22 есть такое решение
Если модуль реализован как расширение, то можно бутстраписть и так, без указания модуля в 'bootstrap' приложения
Wizard писал(а): 2018.03.08, 01:22 но выходит что маршруты модуля загружаются в любом случае
Так вам же и надо чтобы в любом случае (ну в смысле кроме консоли), или о чем вы тут?
я предположил что было бы не плохо загружать маршруты только при обращении к модулю, если не обращаемся то и маршруты не загружаем. если, теоретически, у нас 100 модулей у которых по 5 маршрутов то выходит что загружаем 500 маршрутов которыми и не пользуемся.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: urlManager внутри модуля

Сообщение BalykhinAS »

Nex-Otaku писал(а): 2018.03.08, 07:41 1. Нет, нельзя.

Если ваше требование переложить в реальный мир, то ваш вопрос звучит примерно так. "Можно я отправлю человека в магазин, а когда он до него дойдёт, я ему скажу, в какой магазин идти?"
а если так?

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

    'bootstrap' => [
        'log',
        'app\config\bootstrapModules'
    ],

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

class bootstrapModules implements BootstrapInterface
{
    public function bootstrap($app)
    {
    	// не уверен на счет use($app) можно ведь и \Yii:$app->...
        $app->on(Application::EVENT_BEFORE_REQUEST, function () use($app){

            $url = explode('/', $app->request->getPathInfo());
            $moduleRules = dirname(__DIR__) . '/modules/'. $url[0] .'/rules.php';
            
            // если человек дошел до магазина отправляем ему новый маршрут :-)
            if(file_exists($moduleRules)) {
                $rules = require $moduleRules;
                $app->urlManager->addRules($rules, false);
            }

        });
    }
}
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: urlManager внутри модуля

Сообщение maleks »

Wizard писал(а): 2018.03.08, 12:00 я предположил что было бы не плохо загружать маршруты только при обращении к модулю, если не обращаемся то и маршруты не загружаем.
Все эти правила служат чтобы заменить внутренний адрес на внешний. При разборе из внешнего, из правил, получаем внутренний и уже тогда ,по внутреннему, становится понятно что это за модуль.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: urlManager внутри модуля

Сообщение BalykhinAS »

maleks писал(а): 2018.03.08, 15:14
Wizard писал(а): 2018.03.08, 12:00 я предположил что было бы не плохо загружать маршруты только при обращении к модулю, если не обращаемся то и маршруты не загружаем.
Все эти правила служат чтобы заменить внутренний адрес на внешний. При разборе из внешнего, из правил, получаем внутренний и уже тогда ,по внутреннему, становится понятно что это за модуль.
Маршруты нужны для того что бы отправлять запросы в нужный контроллер и экшен. И держать в памяти маршруты от модулей которые не запрашиваются просто бессмысленно
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: urlManager внутри модуля

Сообщение maleks »

Wizard писал(а): 2018.03.08, 13:33 а если так?
Да вы можете на самом деле тут все что угодно придумывать, это вещи уже над фреймворком, уровня цмс.
Вопрос только в том насколько живучим будет решение.
Например:
$url = explode('/', $app->request->getPathInfo());
$moduleRules = dirname(__DIR__) . '/modules/'. $url[0] .'/rules.php';
- Вы тут предполагаете что все урлы будут начинаться с имени модуля.
В реальности адрес страницы это такая вещь которую надо бы иметь возможность легко сменить, по требованию сеошника например.
- Также вы тут предлагаете модули куда то в одну папочку складывать, это уже сразу отличается от тех модулей, которые обычно используются в yii, они могут быть где угодно.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: urlManager внутри модуля

Сообщение maleks »

Wizard писал(а): 2018.03.08, 15:17 Маршруты нужны для того что бы отправлять запросы в нужный контроллер и экшен. И держать в памяти маршруты от модулей которые не запрашиваются просто бессмысленно
Так а вы в общем случае не знаете что это за модуль запрошен до получения внутреннего пути, да даже и после, в yii модули могут вкладываться в модули, и что за модуль отрабатывает определяется в последний момент, прям перед запуском экшена. Вот этот ваш префикс /имяМодуля/ не катит
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: urlManager внутри модуля

Сообщение BalykhinAS »

Я привёл пример того что это все таки возможно. Думаю не составит труда придумать более интересный способ определения модуля, они ведь в любом случае подключаются в конфиге.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: urlManager внутри модуля

Сообщение maleks »

Wizard писал(а): 2018.03.08, 15:32 Я привёл пример того что это все таки возможно.
Это не жизнеспособный пример, чего его обсуждать... Первое же требование чтобы урл регистрации был не /user/signin (user-имя модуля), а просто /signin поломает вашу задумку.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: urlManager внутри модуля

Сообщение BalykhinAS »

maleks писал(а): 2018.03.08, 15:35
Wizard писал(а): 2018.03.08, 15:32 Я привёл пример того что это все таки возможно.
Это не жизнеспособный пример, чего его обсуждать... Первое же требование чтобы урл регистрации был не /user/signin (user-имя модуля), а просто /signin поломает вашу задумку.
Проверим :-)
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: urlManager внутри модуля

Сообщение Nex-Otaku »

1. От вызова "bootstrap" модуля не избавились.
2. Добавили лишнюю работу.

И всё это ради экономии нескольких строк текста в памяти? Серьёзно?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: urlManager внутри модуля

Сообщение BalykhinAS »

Nex-Otaku писал(а): 2018.03.08, 17:37 1. От вызова "bootstrap" модуля не избавились.
2. Добавили лишнюю работу.

И всё это ради экономии нескольких строк текста в памяти? Серьёзно?
дело то не в самом bootstrap а в загрузке маршрутов только тогда когда они нужны. как бы это не жизненная необходимость, скорее принципиально разобраться :)

собственно в самой документации тот же метод http://stuff.cebe.cc/yii2docs-ru/guide- ... tml#routes

"Таким образом, добавление маршрутов необходимо осуществить в предзагрузке модуля."
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: urlManager внутри модуля

Сообщение urichalex »

вопрос. В основном темплейте приложения нужно сделать ссылку на модуль. Откуда брать правила для формирования ссылки на модуль, если урлманагер еще не знает правил?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: urlManager внутри модуля

Сообщение BalykhinAS »

ElisDN писал(а): 2018.03.09, 00:34 Посмотрите варианты http://www.elisdn.ru/blog/30/perenos-bl ... moduli-yii
Спасибо! Собственно по ссылке ответы для всех скептиков целесообразности и жизнеспособности такого подхода :)
Ответить