uniqid() . '-' . uniqid(), 'requestId' => isset($param['id']) ? $param['id'] : '', 'date' => date(\DateTime::ISO8601), 'success' => true, ]; if (!empty($result)) { $sendParams['result'] = $result; $sendParams['resultType'] = $this->resultType; } if ($this->errorCode > 0) { $sendParams['errorCode'] = $this->errorCode; $sendParams['errorMessage'] = $this->getErrorMessage(); $sendParams['success'] = false; } $type = 'result'; $prefixFile = $this->queueName; if (!empty($this->sendQueueName)) { $type = 'producer'; $prefixFile = $this->sendQueueName; AmqpHelper::publishRaw($this->projectName, $this->sendQueueName, $sendParams); } AmqpLoger::log($type, $sendParams, $prefixFile); return $sendParams; } public function sendResult($queue, $envelope, $result) { $this->publish($result, json_decode($envelope->getBody(), true)); $this->amqp->ack($queue, $envelope); } public abstract function processMessage($params); public function proccess() { $this->amqp = new AmqpHelper; $this->amqp->setProject($this->projectName); $this->amqp->getQueueObject($this->queueName)->consume(function($envelope, $queue) { $value = null; try { $this->errorCode = null; $this->errors = null; $body = $envelope->getBody(); $params = json_decode($body, true); AmqpLoger::log('consumer', empty($params) ? $body : $params, $this->queueName); $value = $this->validate($params) ? $this->processMessage($params) : null; } catch (\Exception $exception) { $this->errorCode = 99; $this->errors['system'] = $exception->getCode() . ' ' . $exception->getMessage(); // throw $exception; } $this->sendResult($queue, $envelope, $value); }); } public function validate($params) { $rules = [ //Поля сообщения запроса 'request' => [ [['id', 'date', 'object', 'api', 'params'], 'required'], [['id', 'object'], 'string', 'max' => 255], [['date'], 'string', 'max' => 50], [['params'], 'arrayValidate'], ], //Поля сообщения ответа 'response' => [ [['id', 'requestId', 'date', 'success'], 'required'], [['id', 'requestId'], 'string', 'max' => 255], [['date'], 'string', 'max' => 50], [['success'], 'boolean'], [['errorCode'], 'integer'], [['result'], 'arrayValidate'], ], ]; if(isset($params['errorCode'])) { $errorMessage = $params['errorCode'] . ' ' . isset($this->arErrorCode[$params['errorCode']]) ? $this->arErrorCode[$params['errorCode']] : ''; $this->setErrors([$params['errorCode'] => $errorMessage]); return false; } return $this->validateArryByRules($params, $rules[$this->typeRule]); } public function validateArryByRules($array, $rules, $errorPrefix = '') { if(!is_array($array)) { $this->setErrors(['Не верный формат массива'], $errorPrefix); return false; } if($array == array_values($array)) //массив должен быть ассоциативным { $this->setErrors(['Не верный формат массива'], $errorPrefix); return false; } $model = CustomDynamicModel::validateData($array, $rules); if ($model->hasErrors()) { $this->setErrors($model->errors, $errorPrefix); return false; } return true; } public function getErrorMessage() { $output = ''; foreach ($this->errors as $key => $value) { $output .= $key . ': "' . implode('", "', (array)$value) . '"; '; } return $output; } public function setErrors($errors, $errorPrefix = '', $code = 98) { foreach ($errors as $key => $value) { $newKey = empty($errorPrefix) ? $key : ($errorPrefix . '.' . $key); $this->errors[$newKey] = $value; } $this->errorCode = 98; } }