161 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
 | 
						||
namespace dominion\amqp\console;
 | 
						||
 | 
						||
use Yii;
 | 
						||
use dominion\amqp\AmqpHelper;
 | 
						||
use dominion\amqp\CustomDynamicModel;
 | 
						||
use dominion\amqp\AmqpLoger;
 | 
						||
 | 
						||
/**
 | 
						||
 *
 | 
						||
 */
 | 
						||
abstract class BaseController extends \yii\console\Controller
 | 
						||
{
 | 
						||
    public $projectName = '';
 | 
						||
    public $queueName = '';
 | 
						||
    public $sendQueueName = ''; //ключ маршрутизации ответа
 | 
						||
    public $amqp;
 | 
						||
    public $errorCode = false;
 | 
						||
    public $typeRule = 'request';
 | 
						||
    public $errors = [];
 | 
						||
    public $resultType;
 | 
						||
    public $arErrorCode = [];
 | 
						||
 | 
						||
    public function publish($result, $param)
 | 
						||
    {
 | 
						||
        $sendParams = [
 | 
						||
            'id' => 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;
 | 
						||
    }
 | 
						||
 | 
						||
}
 |