diff --git a/Resources/config/services.yml b/Resources/config/services.yml index e5f63f9..697a4b9 100755 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -51,3 +51,11 @@ services: - "@validator" Garlic\GraphQL\Argument\ArgumentHelper: + + Garlic\GraphQL\Service\DocumentHydrator: + arguments: + - "@doctrine_mongodb.odm.document_manager" + + Garlic\GraphQL\Service\EntityHydrator: + arguments: + - "@doctrine.orm.entity_manager" diff --git a/Service/Abstracts/AbstractCrudService.php b/Service/Abstracts/AbstractCrudService.php index 44bc9cd..8505d74 100755 --- a/Service/Abstracts/AbstractCrudService.php +++ b/Service/Abstracts/AbstractCrudService.php @@ -3,21 +3,23 @@ namespace Garlic\GraphQL\Service\Abstracts; +use Doctrine\Common\Persistence\ObjectManager; use Doctrine\ORM\Mapping\Entity; -use Doctrine\Common\Inflector\Inflector; /** * Class AbstractCrudService - * @internal use EntityCrudService or DocumentCrudService + * @internal use EntityCrudService or DocumentCrudService | for hydration Use DocumentHydrator or EntityHydrator */ class AbstractCrudService { - /** @var */ - protected $manager; + /** @var ObjectHydrator */ + protected $hydrator; /** * Hydrate array to entity object * + * @deprecated use EntityHydrator + * * @param $object * @param array $arguments * @return Entity @@ -25,20 +27,12 @@ class AbstractCrudService */ protected function hydrate($object, array $arguments) { - foreach ($arguments as $argument => $value) { - if (is_array($value)) { - if(isset($this->manager->getClassMetadata(get_class($object))->associationMappings[$argument])) { - $value = $this->hydrateRelation($object, $argument, $value); - } - } - $object->{"set".Inflector::camelize($argument)}($value); - } - - return $object; + return $this->hydrator->hydrate($object, $arguments); } /** * Map and hydrate relations + * @deprecated use EntityHydrator * * @param $object * @param $name @@ -48,37 +42,18 @@ protected function hydrate($object, array $arguments) */ protected function hydrateRelation($object, string $name, $value) { - $relationClass = $this->manager - ->getClassMetadata(get_class($object)) - ->getAssociationMapping($name)["targetEntity"] - ; - - $relation = $object->{"get".Inflector::camelize($name)}(); - if(in_array('id', array_keys($value))) { - $relation = $this->manager->getRepository($relationClass)->find($value['id']); - unset($value['id']); - } elseif(empty($relation)) { - $relation = new $relationClass; - } - - return $this->hydrate($relation, $value); + return $this->hydrator->hydrateRelation($object, $name, $value); } /** * Make sorting array - * + * @deprecated use EntityHydrator + * * @param $sort * @return array */ protected function mapSorting($sort) { - if(empty($sort)) { - return []; - } - - $mapping = [-1 => 'DESC', 1 => 'ASC']; - return [ - $sort['field'] => $mapping[$sort['order']] - ]; + return $this->hydrator->mapSorting($sort); } -} \ No newline at end of file +} diff --git a/Service/Abstracts/AbstractObjectHydrator.php b/Service/Abstracts/AbstractObjectHydrator.php new file mode 100644 index 0000000..688f878 --- /dev/null +++ b/Service/Abstracts/AbstractObjectHydrator.php @@ -0,0 +1,72 @@ +manager = $manager; + } + + /** + * Hydrate array to entity object + * + * @param $object + * @param array $arguments + * @return Entity + * @throws \Doctrine\ORM\Mapping\MappingException + */ + public function hydrate($object, array $arguments) + { + foreach ($arguments as $argument => $value) { + if (is_array($value)) { + if(isset($this->manager->getClassMetadata(get_class($object))->associationMappings[$argument])) { + $value = $this->hydrateRelation($object, $argument, $value); + } + } + $object->{"set".Inflector::camelize($argument)}($value); + } + + return $object; + } + + /** + * Map and hydrate relations + * + * @param $object + * @param $name + * @param $value + * @return Entity + * @throws \Doctrine\ORM\Mapping\MappingException + */ + abstract public function hydrateRelation($object, string $name, $value); + + /** + * Make sorting array + * + * @param $sort + * @return array + */ + public function mapSorting($sort) + { + if(empty($sort)) { + return []; + } + + $mapping = [-1 => 'DESC', 1 => 'ASC']; + return [ + $sort['field'] => $mapping[$sort['order']] + ]; + } +} diff --git a/Service/DocumentCrudService.php b/Service/DocumentCrudService.php old mode 100644 new mode 100755 index b682a25..4c9687b --- a/Service/DocumentCrudService.php +++ b/Service/DocumentCrudService.php @@ -1,52 +1,26 @@ manager = $manager; + $this->hydrator = new DocumentHydrator($manager); } - - /** - * Map and hydrate relations - * - * @param $object - * @param string $name - * @param $value - * @return Entity - * @throws MappingException - */ - protected function hydrateRelation($object, string $name, $value) - { - $relationClass = $relationClass = $this->manager - ->getClassMetadata(get_class($object)) - ->getAssociationTargetClass($name); - - $relation = $object->{"get".Inflector::camelize($name)}(); - if (in_array('id', array_keys($value))) { - $relation = $this->manager->getRepository($relationClass)->find($value['id']); - unset($value['id']); - } elseif (empty($relation)) { - $relation = new $relationClass; - } - - return $this->hydrate($relation, $value); - } -} \ No newline at end of file +} diff --git a/Service/DocumentHydrator.php b/Service/DocumentHydrator.php new file mode 100644 index 0000000..7450005 --- /dev/null +++ b/Service/DocumentHydrator.php @@ -0,0 +1,44 @@ +manager + ->getClassMetadata(get_class($object)) + ->getAssociationTargetClass($name); + + $relation = $object->{"get".Inflector::camelize($name)}(); + if (in_array('id', array_keys($value))) { + $relation = $this->manager->getRepository($relationClass)->find($value['id']); + unset($value['id']); + } elseif (empty($relation)) { + $relation = new $relationClass; + } + + return $this->hydrate($relation, $value); + } +} diff --git a/Service/EntityCrudService.php b/Service/EntityCrudService.php old mode 100644 new mode 100755 index abeb920..bec69a9 --- a/Service/EntityCrudService.php +++ b/Service/EntityCrudService.php @@ -12,12 +12,13 @@ class EntityCrudService extends AbstractCrudService protected $manager; /** - * ApartmentService constructor. - * + * EntityCrudService constructor. + * @param EntityHydrator $hydrator * @param EntityManagerInterface $manager */ public function __construct(EntityManagerInterface $manager) { - $this->manager = $manager; + $this->manager = $manager; + $this->hydrator = new EntityHydrator($manager); } -} \ No newline at end of file +} diff --git a/Service/EntityHydrator.php b/Service/EntityHydrator.php new file mode 100644 index 0000000..b4cb602 --- /dev/null +++ b/Service/EntityHydrator.php @@ -0,0 +1,49 @@ +manager + ->getClassMetadata(get_class($object)) + ->getAssociationMapping($name)["targetEntity"] + ; + + $relation = $object->{"get".Inflector::camelize($name)}(); + if(in_array('id', array_keys($value))) { + $relation = $this->manager->getRepository($relationClass)->find($value['id']); + unset($value['id']); + } elseif(empty($relation)) { + $relation = new $relationClass; + } + + return $this->hydrate($relation, $value); + } +}