А еще все контролеры наследуются от components/Controller, наверняка в нем можно объявить beforeAction который также унаследуется всеми контроллерами приложений.
to ineersa и Charger, спасибо за подсказку, но это я уже пробовал - что правильнее: генерить в бифоЭкшн или в конструкторе - пока обсуждать рано
тут вскрылась другая проблема, совершенно для меня загадошная
если я вбрасываю исключение непосредственно в экшене, то текст исключения выводится в нужном дизайне, на основании установки errorHandler и errorAction - хоть в майн-конфиге, хоть в инит-методе контроллера, хоть на лету в бифоЭкшн
но если я генерю исключение в бифоЭкш или конструкторе (т.е. НЕ в экшене), то текст исключения выводится или в дизайне errorHandler - errorAction - site/error или вообще без дизайна = на белой странице,
то есть если обработчик ошибок не в контроллере Site - дизайн не применяется
такое впечатление, что во втором случае теряются пути к лайаутам или еррор-виду, поэтому и белый лист
спасибо, я и это пробовал - проблема уже не в способе применения исключения ко всем экшенам, а в корректном отображении текста исключения в нужном дизайне
public function beforeAction($action)
{
if (parent::beforeAction($action))
{
$handler=Yii::app()->getErrorHandler();
$handler->errorAction='my/error';
if ($action->id!='error')
{
throw new CHttpException(403, 'beforeAction доступ запрещен');
return false;
}
return true;
}
else
{
return false;
}
}
и еще, что хотелось бы отметить: без этого условия =
if ($action->id!='error')
{
throw new CHttpException(403, 'beforeAction доступ запрещен');
return false;
}
работать не будет = опять будет текст исключения на белой странице
видать мой просчет был в том, что я не применял проверку на айдишник экшена и [color="#8B0000"]исключение применялось и к экшенЕррору тоже[/color]
вот как было у меня =
protected function beforeAction($action)
{
throw new CHttpException(403, 'beforeAction доступ запрещен');
return parent::beforeAction($action);
}
а надо было так =
protected function beforeAction($action)
{
if ($action->id!='error')
{
throw new CHttpException(403, 'beforeAction доступ запрещен');
return false;
}
return parent::beforeAction($action);
}