/** * Create New Object * * @param string $class Class name * @param Request $request HTTP request * @param bool $create Should a missing object be created? * @param array $options Param converter options * @throws \RuntimeException * @return CrudEntityInterface|mixed */ public function createNewObject($class, Request $request, $create, $options) { $ids = []; $data = $create ? json_decode($request->getContent(), true) : []; if (!is_array($data)) { throw new RuntimeException('Invalid JSON request content'); } // Convert array into object and test validity $object = $this->crudTransformer->arrayToObject($data, $class); if ($object instanceof ValidatableInterface && $create) { $violations = $this->crudTransformer->arrayToObjectPropertyValidation($data, $class); $valid = !(bool) $violations->count(); $object->setViolations($violations); $object->setValid($valid); } // Get list of ids from request attributes if (!$create && $object instanceof CrudEntityInterface) { foreach ($object->getIds() as $field => $value) { $ids[$field] = $request->attributes->get($field); } $object->setIds($ids); } // Convert external entity references into associated objects if (isset($options['references'])) { $references = !is_array(current($options['references'])) ? array($options['references']) : $options['references']; foreach ($references as $reference) { $entity = $this->findObject($reference['class'], $request, array_merge($reference, $options), $reference['name']); $setter = $this->crudTransformer->getPropertySetter($reference['name']); if (method_exists($object, $setter) && is_object($entity)) { $object->{$setter}($entity); } } } return $object; }
/** * Test Array To Object Validation * * @return void */ public function testArrayToObjectValidation() { $classMetadata = $this->prepareClassMetadata(); $this->entityManager->expects($this->once())->method('getClassMetadata')->willReturn($classMetadata); $this->crudTransformer->initializeClassMetadata('className'); $errors = $this->crudTransformer->arrayToObjectPropertyValidation(array('invalid' => 'test'), 'className'); $this->assertEquals(1, $errors->count()); $this->assertEquals('This is not a valid property of className', $errors->get(0)->getMessage()); }