Здравствуйте!
Переписываю проект на 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); ...
Комментариев нет:
Отправить комментарий