Страница 2 из 2

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.28, 22:19
slo_nik
yiiliveext писал(а): 2019.09.28, 21:49
slo_nik писал(а): 2019.09.28, 21:33 Получается, что до контролеров ход не доходил.
Да, работать будет только если в роуте определился существующий контроллер при парсинге запроса
Тогда что делать, если, например, в директорию globe я сложил все контролеры которые относятся к странам-регионам-городам?
Даже если её переименовать в countries, то получится, что есть контролер и директория именно для countries. А остальные куда? Для каждого контролера свою директорию, чтобы она соответствовала названию контролера?

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.28, 22:31
yiiliveext
slo_nik писал(а): 2019.09.28, 22:19 Тогда что делать, если, например, в директорию globe я сложил все контролеры которые относятся к странам-регионам-городам?
Даже если её переименовать в countries, то получится, что есть контролер и директория именно для countries. А остальные куда? Для каждого контролера свою директорию, чтобы она соответствовала названию контролера?
Ответ в предыдущем сообщении, а чем вам система модулей не угодила?

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.28, 22:46
slo_nik
yiiliveext писал(а): 2019.09.28, 22:15 Как вариант, чтобы не подменять родной ErrorHandler, можете добавить в конфиг

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

'on beforeRequest' => function($event) {
        $path = $event->sender->getRequest()->getPathInfo();
        if (preg_match('#^admin(/.*)?$#i', $path)) {
            \Yii::$app->errorHandler->errorAction = 'admin/default/error';
        }
    },
Я так понимаю, что разница небольшая.

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.28, 22:52
yiiliveext
slo_nik писал(а): 2019.09.28, 22:46 Я так понимаю, что разница небольшая.
Если не учитывать то, что вы некорректно распознаете префиксы, то смысл тот же.

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.28, 22:56
slo_nik
yiiliveext писал(а): 2019.09.28, 22:31 Ответ в предыдущем сообщении, а чем вам система модулей не угодила?
У меня всё на модулях есть.
Это второй вариант, пробую, учусь...
Навеяно вот этой статьёй https://habr.com/ru/post/329286/

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.28, 22:57
slo_nik
yiiliveext писал(а): 2019.09.28, 22:52 Если не учитывать то, что вы некорректно распознаете префиксы, то смысл тот же.
Не совсем понял.

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.28, 23:02
yiiliveext
slo_nik писал(а): 2019.09.28, 22:57 Не совсем понял.
Это будет срабатывать на 'kkkkkadmin/jhjh/jhuh' и на 'jjjjj/admin/kjjjhjh' и т.д. Ну и использовать лучше компонент Request

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

if (strpos($_SERVER['REQUEST_URI'], $prefix) !== false)

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.29, 01:05
myks1992@mail.ru
yiiliveext писал(а): 2019.09.28, 22:15 Как вариант, чтобы не подменять родной ErrorHandler, можете добавить в конфиг

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

'on beforeRequest' => function($event) {
        $path = $event->sender->getRequest()->getPathInfo();
        if (preg_match('#^admin(/.*)?$#i', $path)) {
            \Yii::$app->errorHandler->errorAction = 'admin/default/error';
        }
    },
Этот вариант хуже тем, что это магия. Во фреймворке и так достаточно магии. Поэтому лучше класс оставить явным.

Скорее всего дело не в маршрутах/роутинге. Если почитать документацию и найти там « Жизненный цикл приложения», то станет картина более понятной. Сначала регистрируется errorHundler, а потом запускается приложение. До роутов дело не доходит.


https://github.com/yiisoft/yii2/blob/35 ... n.php#L204

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.29, 01:41
myks1992@mail.ru
yiiliveext писал(а): 2019.09.28, 22:31
Ответ в предыдущем сообщении, а чем вам система модулей не угодила?
Система модулей достаточно хорошее решение в Yii2 и когда-то не плохо использовалась в переиспользуемости расширений, но это не так гибко. Само приложение, по сути тоже модуль. Если смотреть по наследованиям. Однако модульная система из Yii3 будет удалена. Разделение будет по папкам (namespace). Подробно:
https://www.yiiframework.ru/forum/viewt ... 38&t=51347

Дмитрий сразу разделил свой проект по папкам, поэтому, его модули просто растворились по папкам, тем самым избавившись от Module.php, Bootstrap.php и конфигов, которые часто делают на Yii2 как переменные в файле Module.php. Переход на Yii3 потребует еще меньше времени.

Это одно из вариантов разделения на модули (сервисы)

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.29, 11:57
yiiliveext
myks1992@mail.ru писал(а): 2019.09.29, 01:05 Этот вариант хуже тем, что это магия. Во фреймворке и так достаточно магии. Поэтому лучше класс оставить явным.
Как раз здесь все максимально прозрачно. Здесь нет никакой магии. Ну разве что посчитать за магию вызов errorHandler вместо getErrorHandler().:D И раз уж на то пошло, то некорректно то, как делает тс определяя errorAction в конструкторе. Он работает с запросом еще до полной инициализации и запуска приложения. Я легко могу поломать его логику, подменив запрос в процессе бутстрапа. Если уж тс хотел делать через свой обработчик, то ему надо было переопределять метод renderException() для того чтобы установить errorAction в зависимости префикса в path.
Скорее всего дело не в маршрутах/роутинге. Если почитать документацию и найти там « Жизненный цикл приложения», то станет картина более понятной. Сначала регистрируется errorHundler, а потом запускается приложение. До роутов дело не доходит.
Мне не надо читать документацию, я прекрасно знаю как оно работает и устроено изнутри. При инициализации контроллеров мы устанавливаем errorAction обработчика, а не весь обработчик.

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.29, 11:59
yiiliveext
myks1992@mail.ru писал(а): 2019.09.29, 01:41 Система модулей достаточно хорошее решение в Yii2 и когда-то не плохо использовалась в переиспользуемости расширений, но это не так гибко. Само приложение, по сути тоже модуль. Если смотреть по наследованиям. Однако модульная система из Yii3 будет удалена. Разделение будет по папкам (namespace). Подробно:
https://www.yiiframework.ru/forum/viewt ... 38&t=51347

Дмитрий сразу разделил свой проект по папкам, поэтому, его модули просто растворились по папкам, тем самым избавившись от Module.php, Bootstrap.php и конфигов, которые часто делают на Yii2 как переменные в файле Module.php. Переход на Yii3 потребует еще меньше времени.

Это одно из вариантов разделения на модули (сервисы)

Вас так забавно читать))

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.29, 13:08
slo_nik
yiiliveext писал(а): 2019.09.28, 23:02
slo_nik писал(а): 2019.09.28, 22:57 Не совсем понял.
Это будет срабатывать на 'kkkkkadmin/jhjh/jhuh' и на 'jjjjj/admin/kjjjhjh' и т.д. Ну и использовать лучше компонент Request

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

if (strpos($_SERVER['REQUEST_URI'], $prefix) !== false)
Да, думаю я понял.
Тут подумал на досуге, немного погорячился с примером на котором не работает errorAction.
Всё взято со старого проекта, так как раз использовались модули, но модуль для примера я взял неудачный. Его сначала надо было переписать на использование одного контролера, чтобы не было отдельно для стран, отдельно для городов, отдельно для регионов.
Если переписать, вот тогда да, будет один контролер и тогда всё сработает. Тогда не надо будет раскладывать по разным директориям.
Но тогда как всё-таки быть если есть и директория, в которой группа контролеров и отдельный контролер? Описывать маршруты так, как сейчас у меня сделано?

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.09.30, 14:33
yiiliveext
slo_nik писал(а): 2019.09.29, 13:08 Но тогда как всё-таки быть если есть и директория, в которой группа контролеров и отдельный контролер? Описывать маршруты так, как сейчас у меня сделано?
Реализовать можно по-разному, прописывать правила для каждой группы, подменять controllerNamespace, переоределить CreateController и переписать логику формирования класса контроллера из роута под себя. Но это все некорректно, поскольку некорректно то, что вы делаете изначально. Модуль - это набор логически связанного кода, поэтому логично его располагать в отдельной папке. Если не хотите использовать функционал модулей, просто создайте папку admin в корне, например, и вынесите туда все ваши контроллеры, вьюхи, модели и все, что относится к этому модулю. На самом деле yii2, при включенном prettyUrl, позволяет назначать в правилах контроллеры с произвольным неймспейсом, поэтому прописать нужные контроллеры вашего модуля не составит труда. Это, конечно, принесет некоторые неудобства (например,нужно будет прописывать полные пути в методе render), поскольку это не нативный метод, но в целом решение будет вполне рабочим.

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.10.05, 20:38
slo_nik
yiiliveext писал(а): 2019.09.30, 14:33 Если не хотите использовать функционал модулей, просто создайте папку admin в корне, например, и вынесите туда все ваши контроллеры, вьюхи, модели и все, что относится к этому модулю..
И получится всё тот же модуль.

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.10.06, 10:40
yiiliveext
slo_nik писал(а): 2019.10.05, 20:38 И получится всё тот же модуль.
Эмм, а вы что пытались сделать, запихивая контроллеры в папку admin?

Re: Как сделать разные страницы ошибок для разных контролеров?

Добавлено: 2019.11.08, 11:13
slo_nik
yiiliveext писал(а): 2019.10.06, 10:40 Эмм, а вы что пытались сделать, запихивая контроллеры в папку admin?
Просто разложить всё по отдельным директориям для удобства.