как организовать редирект?

Духовность™

Продвинутый новичок
как организовать редирект?

В общем, стоит задача сделать редирект в контроллере. Что сейчас есть:

PHP:
$redirect = new Redirect();
$redirect->setMessage('Действие выполнено');
$redirect->setRedirectUrl('/admin/user/');
дальше нужно сделать $redirect->run() что бы сохранить сообщение в БД и сделать Location на /admin/user/?id_redirect=123

Я мог бы сделать такой метод в контроллере:

PHP:
function redirect(Redirect $redirect)
{
    // сохраняем сообщение в базу
    $redirect->run();

    // устанавливаем URL для Location
    $this->response->setHeader('Location', $redirect->getRedirectUrl());

    // Отсылаем HTTP-заголовки
    $this->response->sendHeaders();

    exit; // WTF?
}
и вызывать так:

PHP:
if ($error)
{
    $redirect = new Redirect();
    $redirect->setMessage('Действие выполнено');
    $redirect->setRedirectUrl('/admin/user/');
    $this->redirect( $redirect );
}

// тут сценарий дальше что-то может делать
но меня смущает exit. Это дико не ООП-шно. НО exit нужен, что бы не выводить случайно какие-нибудь данные.

Я вот думаю, а может делать редирект - это не задача контроллера, а задача приложения, которое и инстанцирует контроллер?
 

fixxxer

К.О.
Партнер клуба
я кидаю RedirectException, который ловлю в фронт контроллере :)
 

WebAngel

Новичок
но меня смущает exit.
А то, что класс, который называет Redirect не выполняет редирект, это не смущает? И это не говоря о методе run который только сохраняет сообщение :)
 

Духовность™

Продвинутый новичок
я кидаю RedirectException, который ловлю в фронт контроллере
я так делал. но управлять логикой с помощью исключений не есть гуд, имхо.

А то, что класс, который называет Redirect не выполняет редирект, это не смущает?
а он и не должен выполнять редирект, выполнять редирект должны функции, специфичные для HTTP ответа.
 

fixxxer

К.О.
Партнер клуба
>>но управлять логикой с помощью исключений не есть гуд, имхо.

Я тоже сомневался, даже один раз убирал, но удобство такого решения в итоге перевесило)

Чтобы особо не париться, "замаскировался" методом контроллера. $this->redirectToUrl() / $this->redirectToPage() - нормально выглядит, чо %)
 

WebAngel

Новичок
а он и не должен выполнять редирект, выполнять редирект должны функции, специфичные для HTTP ответа.
класс должен быть самодостаточным, если он предназначен для редиректа, значит он должен выполнять редирект, а хттп пусть используется внутри.

можешь проверсти эксперимент, покажи каркас класса коллеге:
PHP:
class Redirect{
      public function setUrl();
      public function setMessage();
      public function run();
}
и используя его, пусть он, напишет код выполняющий редирект
 

fixxxer

К.О.
Партнер клуба
ну кстати да.

если уж не хочется исключений, я бы сделал здесь как-то так:

class RedirectEvent {
public function __construct(IResponse $Response);
public function setUrl(Url $Url);
public function run();
}

в action контроллере типа

$this->raiseEvent( Injector()->create('RedirectEvent')->setUrl($Url) );
return false;

ну и где-то там его словить:

foreach ($this->Events as $Event) $Event->run();

где run() сделает что то типа

$this->Response->status($this->status);
$this->Response->header('Location', $this->Url->getAbsolute());
 

Fortop

Новичок
А не проще ли использовать какой-нибудь Response?

PHP:
if (!$acl->isValid()) {
    $appResponse = $redirect->setResponse(Response_HTTP $obj)->setAction('nextAction')->setController('someController')->execute();
} else {
    $appResponse = $this->view->setResponse(Response_HTTP $obj)->setScript('my.phtml')->execute();
}
И дальше
PHP:
echo $appResponse;
 

Mols

Новичок
Ребят ну фига се.
Никому кроме меня не кажется, что "дикая не ООПшность" exit это не та проблема которую надо вообще решать?
Соглашусь только с тем что сам класс должен редирект делать.... если это всё-таки будет через класс делаться.
 
Сверху