Как "красиво" выйти из класса при пользовательской ошибке?

Духовность™

Продвинутый новичок
Как "красиво" выйти из класса при пользовательской ошибке?

Нужно при пользовательской ошибке в приложении делать header: location. Раньше это выглядело так:

PHP:
if (!$user->checkAccess())) // ошибка - нет прав 
{           
    $redirect = new Redirect();
    $redirect->setType('alert');
    $redirect->setMessage('Нет прав');
    $redirect->setRedirectUrl('/admin/user.html');
    $redirect->run(); // тут выполнялся header и стоял exit
}
Сейчас подумываю над тем, что бы кидать исключения:

PHP:
if (!$user->checkAccess()) // ошибка 
{           
    throw new RedirectException('alert', 'Нет прав', '/admin/user.html');
}
Соответственно на самом верхнем уровне это исключение будет ловиться:

PHP:
        try
        {
              // application
        }
        catch (Exception $e)
        {
               //...
        }
        catch (RedirectException $e)
        {
             $redirect = new Redirect();
             $redirect->setType( $e->type);
             $redirect->setMessage( $e->message );
             $redirect->setRedirectUrl( $e->url );
             $redirect->run();
        }
    }
Меня интересует вопрос - правильно ли использовать исключения в таком контексте? Я где-то читал, что механизм исключений мол предназначен для ловли ошибок уровня программы, а тут явно не исключительная ситуация.
 

no_santa

Снегур
ИМХО, конечно...

1. Почему не оставить хедеры на уровень вьюшек? Низкую логику - моделям, высокую - контроллерам, вывод (в т.ч. хедеры) - вьюшкам. Обычно я стараюсь полностью завершить сценарий в логике, включая исключения. И уже потом - $this->load->view(...)

2. Бессмысленно искать стиль и/или академичность, занимаясь PHP. По той простой причине, что сам PHP далек от академичности. Это длинные поиски, которые мощно отвлекают от работы и при этом ведут в никуда.

-~{}~ 28.08.09 16:47:

Кстати, еще один плюс к п.1 - возможность вывести страницу с ручным редиректом, если запрещен нормальный.
 

Adelf

Administrator
Команда форума
no_santa, ересь какая :)

triumvirat, а что побудило перейти на исключения(надеюсь не более короткий код :) )?
 

Духовность™

Продвинутый новичок
no_santa
стоп. при чем тут view?

что побудило перейти на исключени
Как "красиво" выйти из класса при пользовательской ошибке? Exit не хочу использовать, он в рамки ООП не помещается, no_santa верно подметил про "академичность".
 

whirlwind

TDD infected, paranoid
На agiledev не так довно обсуждался точно этот вопрос. Лично я делаю контроллеры observable, а потом подписываю фронт контроллер

PHP:
class FrontController
{
...
    function run()
    {
        $this->getController()->run();
        if ( !$this->isRedirect )
        {
            $this->context->getView()->display($this->templateId . '.tpl');
        }
    }
...
    function getController()
    {
        $this->templateId = substr($this->context
            ->getServer()->getStr('PATH_INFO','/index'), 1);
        $ctrl = $this->produceController($this->templateId);
        $ctrl->on('redirect', 'onRedirect', $this);
        $ctrl->on('display', 'onDisplay', $this);
        return $ctrl;
    }
...
 

no_santa

Снегур
whirlwind +1
triumvirat ^^^ MVC ^^^

-~{}~ 28.08.09 17:12:

Мой ответ на заданный вопрос - писать метасценарий, как MVC "положено".
 

Духовность™

Продвинутый новичок
С ума сойти. 4 листа темы на agiledev!

[офф.]
Я вот жидкость для гидроусилителя руля хотел на машине залить, зашел на авто-форум, спросить какую именно, а там тема про это - на 8 листов и нет однозначного ответа. Иногда лучше не спрашивать ^_^
[/офф.]
 
Сверху