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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2019.09.28, 22:19

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

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2019.09.28, 22:31

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

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2019.09.28, 22:46

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';
        }
    },
Я так понимаю, что разница небольшая.

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2019.09.28, 22:52

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

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2019.09.28, 22:56

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

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2019.09.28, 22:57

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

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение 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)

myks1992@mail.ru
Сообщения: 137
Зарегистрирован: 2017.11.15, 23:54

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

Сообщение myks1992@mail.ru » 2019.09.29, 01:05

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

myks1992@mail.ru
Сообщения: 137
Зарегистрирован: 2017.11.15, 23:54

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

Сообщение myks1992@mail.ru » 2019.09.29, 01:41

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 потребует еще меньше времени.

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

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2019.09.29, 11:57

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

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2019.09.29, 11:59

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 потребует еще меньше времени.

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

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

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2019.09.29, 13:08

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.
Всё взято со старого проекта, так как раз использовались модули, но модуль для примера я взял неудачный. Его сначала надо было переписать на использование одного контролера, чтобы не было отдельно для стран, отдельно для городов, отдельно для регионов.
Если переписать, вот тогда да, будет один контролер и тогда всё сработает. Тогда не надо будет раскладывать по разным директориям.
Но тогда как всё-таки быть если есть и директория, в которой группа контролеров и отдельный контролер? Описывать маршруты так, как сейчас у меня сделано?

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2019.09.30, 14:33

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

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2019.10.05, 20:38

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

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2019.10.06, 10:40

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

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2019.11.08, 11:13

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

Ответить