public function endVisitingObject(JMSClassMetadata $metadata, $data, array $type, Context $context) { $rs = parent::endVisitingObject($metadata, $data, $type, $context); if (empty($rs)) { return null; } $isSaveChanges = $context instanceof SaveChangesContextInterface; if ($this->isProxyObject($data) && ($isSaveChanges || !$data->__isInitialized())) { return null; } try { $doctrineMeta = $this->entityManager->getClassMetadata($metadata->name); if ($doctrineMeta) { $rs['$type'] = strtr($type['name'], '\\', '.'); foreach ($doctrineMeta->associationMappings as $associationMapping) { $foreignKey = $associationMapping['fieldName'] . 'Id'; if (isset($rs[$foreignKey])) { continue; } $isScalar = in_array((int) $associationMapping['type'], array(ClassMetadata::ONE_TO_ONE, ClassMetadata::MANY_TO_ONE)); $isOwningSide = isset($associationMapping['isOwningSide']) ? $associationMapping['isOwningSide'] : false; if (!($isScalar && $isOwningSide)) { continue; } try { $getter = 'get' . $associationMapping['fieldName']; if (method_exists($data, $getter)) { $association = $data->{$getter}(); } else { $refl = new \ReflectionClass($data); if ($this->isProxyObject($data)) { $refl = $refl->getParentClass(); } try { $prop = $refl->getProperty($associationMapping['fieldName']); $prop->setAccessible(true); $association = $prop->getValue($data); } catch (\ReflectionException $e) { } } if ($association) { try { $id = $association->getId(); $rs[$foreignKey] = $id; } catch (\Exception $e) { } } } catch (\ReflectionException $e) { // continue; } } } } catch (\Exception $e) { return $rs; } return $rs; }
/** * {@inheritdoc} */ public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) { $rs = parent::endVisitingObject($metadata, $data, $type, $context); /** @var JsonApiClassMetadata $jsonApiMetadata */ $jsonApiMetadata = $this->metadataFactory->getMetadataForClass(get_class($data)); if (null === $jsonApiMetadata) { return $rs; } $idField = $jsonApiMetadata->getIdField(); if (empty($rs)) { $rs = new \ArrayObject(); if (array() === $this->getRoot()) { $this->setRoot(clone $rs); } return $rs; } $result = array(); if (isset($rs['type'])) { $result['type'] = $rs['type']; } if (isset($rs[$idField])) { $result['id'] = $rs[$idField]; } $result['attributes'] = array_filter($rs, function ($key) use($idField) { switch ($key) { case $idField: case 'type': case 'relationships': case 'links': return false; } return true; }, ARRAY_FILTER_USE_KEY); if (isset($rs['relationships'])) { $result['relationships'] = $rs['relationships']; } if (isset($rs['links'])) { $result['links'] = $rs['links']; } return $result; }
/** * {@inheritdoc} */ public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) { $rs = parent::endVisitingObject($metadata, $data, $type, $context); if ($rs instanceof \ArrayObject) { $rs = []; $this->setRoot($rs); return $rs; } /** @var JsonApiClassMetadata $jsonApiMetadata */ $jsonApiMetadata = $this->metadataFactory->getMetadataForClass(get_class($data)); if (null === $jsonApiMetadata) { return $rs; } $result = array(); if (isset($rs[JsonEventSubscriber::EXTRA_DATA_KEY]['type'])) { $result['type'] = $rs[JsonEventSubscriber::EXTRA_DATA_KEY]['type']; } if (isset($rs[JsonEventSubscriber::EXTRA_DATA_KEY]['id'])) { $result['id'] = $rs[JsonEventSubscriber::EXTRA_DATA_KEY]['id']; } $idField = $jsonApiMetadata->getIdField(); $result['attributes'] = array_filter($rs, function ($key) use($idField) { switch ($key) { case $idField: case 'relationships': case 'links': return false; } if ($key === JsonEventSubscriber::EXTRA_DATA_KEY) { return false; } return true; }, ARRAY_FILTER_USE_KEY); if (isset($rs['relationships'])) { $result['relationships'] = $rs['relationships']; } if (isset($rs['links'])) { $result['links'] = $rs['links']; } return $result; }