Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

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

Здравствуйте! Переписываю проект на 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 "
[x] Обработано " . $msg->delivery_info['routing_key'] . ' : ' . $bodyStr . "
"; $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(); // тут вообще муть начинается, так как он сбрасывает очень много всего и заново воспользоваться получение инстанса пока не получается. В общем вот... такая лабуда, есть ли у кого мысли, как сбросить все настройки Фронт-контроллера, чтобы при каждом новом вызове все было как будто "в первый раз"? Заранее спасибо.


Ответ

$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); ...

Комментариев нет:

Отправить комментарий