Rules urlManager-а внутри модуля
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Rules urlManager-а внутри модуля
Можно ли как то задать маршруты модуля только при его инициализации что бы не забивать их в основные маршруты?
есть такое решение https://github.com/albertborsos/yii2-us ... hp#L18-L24
1) Модуль должен реализовывать BootstrapInterface
2) В конфиге в мы должны бутсрапить модуль
3) В самом модуле задаем нужные рулы
но выходит что маршруты модуля загружаются в любом случае
есть такое решение https://github.com/albertborsos/yii2-us ... hp#L18-L24
1) Модуль должен реализовывать BootstrapInterface
2) В конфиге в мы должны бутсрапить модуль
3) В самом модуле задаем нужные рулы
но выходит что маршруты модуля загружаются в любом случае
Последний раз редактировалось BalykhinAS 2018.03.09, 13:09, всего редактировалось 1 раз.
Re: urlManager внутри модуля
1. Нет, нельзя.
Если ваше требование переложить в реальный мир, то ваш вопрос звучит примерно так. "Можно я отправлю человека в магазин, а когда он до него дойдёт, я ему скажу, в какой магазин идти?"
Если у приложения при разборе URL нет маршрутов модуля, приложение никак не узнает, что запрос должен разбирать именно этот модуль. Поэтому так работать не будет - обработка запроса просто никогда не дойдёт до модуля.
Более того, красивые ссылки вида "Url::to()" вне модуля вы тоже не сможете сгенерировать - ведь маршрутов не будет.
2. А зачем вам это понадобилось?
Если ваше требование переложить в реальный мир, то ваш вопрос звучит примерно так. "Можно я отправлю человека в магазин, а когда он до него дойдёт, я ему скажу, в какой магазин идти?"
Если у приложения при разборе URL нет маршрутов модуля, приложение никак не узнает, что запрос должен разбирать именно этот модуль. Поэтому так работать не будет - обработка запроса просто никогда не дойдёт до модуля.
Более того, красивые ссылки вида "Url::to()" вне модуля вы тоже не сможете сгенерировать - ведь маршрутов не будет.
2. А зачем вам это понадобилось?
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: urlManager внутри модуля
«Я прошу человека дойти до магазина а когда он дойдёт скажу в какой отдел ему ити»
Вы ведь методы объекта создаёте в самом объекте или slug-и вы тоже прописываете в приложении для всех объектов?
Понадобилось по простой причине - хранить правила модуля внутри модуля и применять их только тогда когда в этом модуле есть потребность
Вы ведь методы объекта создаёте в самом объекте или slug-и вы тоже прописываете в приложении для всех объектов?
Понадобилось по простой причине - хранить правила модуля внутри модуля и применять их только тогда когда в этом модуле есть потребность
Re: urlManager внутри модуля
Если модуль реализован как расширение, то можно бутстраписть и так, без указания модуля в 'bootstrap' приложения
Так вам же и надо чтобы в любом случае (ну в смысле кроме консоли), или о чем вы тут?
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: urlManager внутри модуля
я предположил что было бы не плохо загружать маршруты только при обращении к модулю, если не обращаемся то и маршруты не загружаем. если, теоретически, у нас 100 модулей у которых по 5 маршрутов то выходит что загружаем 500 маршрутов которыми и не пользуемся.
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: urlManager внутри модуля
а если так?
Код: Выделить всё
'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);
}
});
}
}
Re: urlManager внутри модуля
Все эти правила служат чтобы заменить внутренний адрес на внешний. При разборе из внешнего, из правил, получаем внутренний и уже тогда ,по внутреннему, становится понятно что это за модуль.
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: urlManager внутри модуля
Маршруты нужны для того что бы отправлять запросы в нужный контроллер и экшен. И держать в памяти маршруты от модулей которые не запрашиваются просто бессмысленно
Re: urlManager внутри модуля
Да вы можете на самом деле тут все что угодно придумывать, это вещи уже над фреймворком, уровня цмс.
Вопрос только в том насколько живучим будет решение.
Например:
- Вы тут предполагаете что все урлы будут начинаться с имени модуля.$url = explode('/', $app->request->getPathInfo());
$moduleRules = dirname(__DIR__) . '/modules/'. $url[0] .'/rules.php';
В реальности адрес страницы это такая вещь которую надо бы иметь возможность легко сменить, по требованию сеошника например.
- Также вы тут предлагаете модули куда то в одну папочку складывать, это уже сразу отличается от тех модулей, которые обычно используются в yii, они могут быть где угодно.
Re: urlManager внутри модуля
Так а вы в общем случае не знаете что это за модуль запрошен до получения внутреннего пути, да даже и после, в yii модули могут вкладываться в модули, и что за модуль отрабатывает определяется в последний момент, прям перед запуском экшена. Вот этот ваш префикс /имяМодуля/ не катит
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: urlManager внутри модуля
Я привёл пример того что это все таки возможно. Думаю не составит труда придумать более интересный способ определения модуля, они ведь в любом случае подключаются в конфиге.
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: urlManager внутри модуля
Проверим
Re: urlManager внутри модуля
1. От вызова "bootstrap" модуля не избавились.
2. Добавили лишнюю работу.
И всё это ради экономии нескольких строк текста в памяти? Серьёзно?
2. Добавили лишнюю работу.
И всё это ради экономии нескольких строк текста в памяти? Серьёзно?
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: urlManager внутри модуля
дело то не в самом bootstrap а в загрузке маршрутов только тогда когда они нужны. как бы это не жизненная необходимость, скорее принципиально разобраться
собственно в самой документации тот же метод http://stuff.cebe.cc/yii2docs-ru/guide- ... tml#routes
"Таким образом, добавление маршрутов необходимо осуществить в предзагрузке модуля."
Re: urlManager внутри модуля
вопрос. В основном темплейте приложения нужно сделать ссылку на модуль. Откуда брать правила для формирования ссылки на модуль, если урлманагер еще не знает правил?
Re: urlManager внутри модуля
Посмотрите варианты http://www.elisdn.ru/blog/30/perenos-bl ... moduli-yii
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: urlManager внутри модуля
Спасибо! Собственно по ссылке ответы для всех скептиков целесообразности и жизнеспособности такого подходаElisDN писал(а): ↑2018.03.09, 00:34 Посмотрите варианты http://www.elisdn.ru/blog/30/perenos-bl ... moduli-yii