/**
  * [ВНИМАНИЕ]
  * Если у сущности генератор первичного ключа отсутствует, т.е. необходимо задать вручную ключ, то необходимо удалить
  * первичный ключ из структуры, чтобы не было попыток найти эту сущность. Ошибка описана в ссылке ниже
  * @link https://github.com/jamesmoey/extjs-bundle/issues/17
  * @inheritdoc
  */
 public function run()
 {
     $this->checkIsInit();
     $obj = json_decode($this->requestContent, false, 512, JSON_BIGINT_AS_STRING);
     $response = new RestResponse();
     $savedPKValueFromRequestData = null;
     $PKFieldName = $this->getPKFieldName();
     $entityNotHaveIdGenerator = $this->classMetadata->generatorType == ClassMetadata::GENERATOR_TYPE_NONE;
     if ($entityNotHaveIdGenerator) {
         if (!$this->isObjectHasPKField($obj) && !$this->isObjectHasNewPKField($obj)) {
             $response->setSuccess(false)->setStatusCode(RestResponse::STATUS_CODE_WRONG_INPUT_DATA)->setMessage(sprintf("Не указан первичный ключ (%s)", $PKFieldName));
             return $response;
         } elseif (!$this->isObjectHasPKField($obj) && $this->isObjectHasNewPKField($obj)) {
             $savedPKValueFromRequestData = $this->getNewPKValueFromObject($obj);
             unset($obj->{$this->getNewPKValueFromObject($obj)});
         } elseif ($this->isObjectHasPKField($obj) && !$this->isObjectHasNewPKField($obj)) {
             $savedPKValueFromRequestData = $obj->{$PKFieldName};
             unset($obj->{$PKFieldName});
         }
     }
     $serializedObj = json_encode($obj);
     $entity = $this->serializer->deserialize($serializedObj, $this->classMetadata->getName(), 'json', DeserializationContext::create()->setGroups([Action::GROUP_DEFAULT, Action::GROUP_POST]));
     if ($entityNotHaveIdGenerator) {
         EntityHelper::changePKValue($this->em, $entity, $savedPKValueFromRequestData);
     }
     $validator = $this->validator;
     /** @var ConstraintViolationList $validations */
     $validations = $validator->validate($entity);
     if (sizeof($validations) === 0) {
         try {
             $this->em->persist($entity);
             $this->em->flush();
             $this->em->refresh($entity);
             $response->setSuccess(true)->setData($entity)->setStatusCode(RestResponse::STATUS_CODE_OK);
         } catch (DBALException $e) {
             $response->setSuccess(false)->setMessage($e->getMessage())->setStatusCode(RestResponse::STATUS_CODE_WRONG_INPUT_DATA);
         }
     } else {
         $response->setSuccess(false)->setStatusCode(RestResponse::STATUS_CODE_WRONG_INPUT_DATA)->setErrors($validations);
     }
     return $response;
 }
 public function testHttpStatusMethods()
 {
     $this->obj->setStatusCode(RestResponse::STATUS_CODE_OK);
     $this->assertEquals(RestResponse::STATUS_CODE_OK, $this->obj->getStatusCode());
 }
 /**
  * @param RestResponse $restResponse
  * @param array $serializationGroups
  * @param int $httpOKStatus при POST запросе задайте этот параметр в 201
  *
  * @return View
  */
 public static function generateViewFromRestResponse(RestResponse $restResponse, $serializationGroups = [], $httpOKStatus = 200)
 {
     $HTTPStatusCode = 200;
     switch ($restResponse->getStatusCode()) {
         case RestResponse::STATUS_CODE_OK:
             if (!in_array($httpOKStatus, [200, 201])) {
                 $HTTPStatusCode = 200;
             } else {
                 $HTTPStatusCode = $httpOKStatus;
             }
             break;
         case RestResponse::STATUS_CODE_ENTITY_NOT_FOUND:
             $HTTPStatusCode = 404;
             break;
         case RestResponse::STATUS_CODE_WRONG_INPUT_DATA:
             $HTTPStatusCode = 400;
             break;
     }
     $view = View::create($restResponse->asArray(), $HTTPStatusCode)->setSerializationContext(self::createSerializerContext($serializationGroups));
     return $view;
 }