Сброс настроек Zend_Controller_Front

Рейтинг: 3Ответов: 1Опубликовано: 10.12.2014

Здравствуйте!

Переписываю проект на SOA и перевожу public/index.php в демона, который умеет принимать сообщения из RabbitMQ, обрабатывать их и отправлять дальше по цепочке в кролика. Столкнулся с проблемой, когда хочу сделать запрос на свой контроллер и экшен, то происходит только 1 вызов, а потом всё зацикливается и не получается установить новый контроллер/экшен...

Код коллбека, который дергается при приходе сообщения из кролика:

/** @param $msg PhpAmqpLib\Message\AMQPMessage */
$callback = function ($msg) {
    $dataIn = json_decode($msg->body);
    $bodyStr = $body = '';

    $auth = Zend_Auth::getInstance();

    $front = Zend_Controller_Front::getInstance();

    if (isset($dataIn->user_id) && !empty($dataIn->user_id)) {
        $storage = $auth->getStorage();
        $data = new stdClass();
        $data->user_id = $dataIn->user_id;
        $storage->write((array)$data);

        $request = $front->getRequest();
        $request->setParams((array)$dataIn->param);
        $request->setRequestUri($dataIn->url);
        $response = $front->getResponse();

        $front->dispatch($request, $response);

        print_r(array(
            "getActionKey" => $request->getActionKey(),
            "getActionName" => $request->getActionName(),
            "getControllerKey" => $request->getControllerKey(),
            "getControllerName" => $request->getControllerName(),
        ));

        $body = json_decode($response->getBody());
    }
    $front->clearParams();

    $body->client_id = $dataIn->client_id;
    $bodyStr = json_encode($body);

    /** @var $msgChannel PhpAmqpLib\Channel\AMQPChannel */
    $msgChannel = $msg->delivery_info['channel'];
    $msgChannel->basic_ack($msg->delivery_info['delivery_tag']);

    //echo "\n[x] Обработано " . $msg->delivery_info['routing_key'] . ' : ' . $bodyStr . "\n";
    $sender = new SenderSysEventToOutox();
    $sender->send($bodyStr, $dataIn->client_id);
    $auth->getStorage()->clear();
};

В сообщении содержится информация о пользователе, который совершает действие

$dataIn->user_id

В демоне мы устанавливаем ему "авторизацию" на время выполнения запроса, после сбрасываем. Получаем инстанс фронт контроллера

$front = Zend_Controller_Front::getInstance();

и после установки параметров делаем вызов на контроллер/экшен, который пришел в сообщении.

$request->setParams((array)$dataIn->param);
$request->setRequestUri($dataIn->url);
$response = $front->getResponse();
$front->dispatch($request, $response);

И в конце очищаем все установленные ранее параметры

$front->clearParams();

После прихода нового сообщения, по идее, должен происходить все как с чистого листа, так как параметры очищены, но беда бедовая в том, что оно так не происходит, я уже что только не пробовал, и такие комбинации:

$front->getResponse()->clearAllHeaders()->clearRawHeaders()->clearBody();

И делал

$front->resetInstance(); // тут вообще муть начинается, так как он сбрасывает очень много всего и заново воспользоваться получение инстанса пока не получается.

В общем вот... такая лабуда, есть ли у кого мысли, как сбросить все настройки Фронт-контроллера, чтобы при каждом новом вызове все было как будто "в первый раз"?

Заранее спасибо.

Ответы

▲ 2Принят
$front = Zend_Controller_Front::getInstance();
$clonedFront = clone $front;

работаем с клоном. По окончании убиваем клона.

UPD: clone не будет работать, т.к. singleton.. сорри.

Попытка номер 2: Вручную создавать обьект Zend_Controller_Request_Http.

$request = new Zend_Controller_Request_Http(); //Здесь он сам подхватит новый URI, либо в параметрах указать его
Zend_Controller_Front::getInstance()->setRequest($request);
...