From ea601fae2215df9d5df83ad56c539cb47b035543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nil=20Portugu=C3=A9s=20Calder=C3=B3?= Date: Sat, 17 Oct 2015 01:09:15 +0200 Subject: [PATCH] Fetch all data from eloquent --- .../JsonApiSerializer/JsonApiSerializer.php | 66 +++++++++++++++++++ .../Mapper/MappingFactory.php | 1 + 2 files changed, 67 insertions(+) diff --git a/src/NilPortugues/Laravel5/JsonApiSerializer/JsonApiSerializer.php b/src/NilPortugues/Laravel5/JsonApiSerializer/JsonApiSerializer.php index 53a55fe..8689852 100644 --- a/src/NilPortugues/Laravel5/JsonApiSerializer/JsonApiSerializer.php +++ b/src/NilPortugues/Laravel5/JsonApiSerializer/JsonApiSerializer.php @@ -10,9 +10,12 @@ */ namespace NilPortugues\Laravel5\JsonApiSerializer; +use ErrorException; use Illuminate\Database\Eloquent\Model; use NilPortugues\Api\JsonApi\JsonApiTransformer; use NilPortugues\Serializer\DeepCopySerializer; +use ReflectionClass; +use ReflectionMethod; /** * Class JsonApiSerializer. @@ -46,13 +49,76 @@ protected function serializeObject($value) } if (is_subclass_of($value, Model::class, true)) { + + $stdClass = (object) $value->getAttributes(); $data = $this->serializeData($stdClass); $data[self::CLASS_IDENTIFIER_KEY] = get_class($value); + $methods = $this->getRelationshipMethodsAsPropertyName($value, get_class($value), new ReflectionClass($value)); + + if(!empty($methods)) { + $data = array_merge($data, $methods); + } + return $data; } return parent::serializeObject($value); } + + + /** + * @param $value + * @param string $className + * @param ReflectionClass $reflection + * + * @return array + */ + protected function getRelationshipMethodsAsPropertyName($value, $className, ReflectionClass $reflection) + { + + $methods = []; + foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { + if (ltrim($method->class, "\\") === ltrim($className, "\\")) { + + $name = $method->name; + $reflectionMethod = $reflection->getMethod($name); + + // Eloquent relations do not include parameters, so we'll be filtering based on this criteria. + if (0 == $reflectionMethod->getNumberOfParameters()) { + try { + $returned = $reflectionMethod->invoke($value); + //All operations (eg: boolean operations) are now filtered out. + if (is_object($returned)) { + + // Only keep those methods as properties if these are returning Eloquent relations. + // But do not run the operation as it is an expensive operation. + if (false !== strpos(get_class($returned), 'Illuminate\Database\Eloquent\Relations')) { + + $items = []; + foreach($returned->getResults() as $model) { + + if(is_object($model)) { + $stdClass = (object) $model->getAttributes(); + $data = $this->serializeData($stdClass); + $data[self::CLASS_IDENTIFIER_KEY] = get_class($model); + + $items[] = $data; + } + } + if(!empty($items)) { + $methods[$name] = [self::MAP_TYPE => 'array', self::SCALAR_VALUE => $items]; + } + + } + } + } catch(ErrorException $e) {} + } + } + } + + + return $methods; + } } diff --git a/src/NilPortugues/Laravel5/JsonApiSerializer/Mapper/MappingFactory.php b/src/NilPortugues/Laravel5/JsonApiSerializer/Mapper/MappingFactory.php index a319e18..5d9ed6f 100644 --- a/src/NilPortugues/Laravel5/JsonApiSerializer/Mapper/MappingFactory.php +++ b/src/NilPortugues/Laravel5/JsonApiSerializer/Mapper/MappingFactory.php @@ -66,6 +66,7 @@ protected static function getRelationshipMethodsAsPropertyName($value, $classNam { $methods = []; foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { + if (ltrim($method->class, "\\") === ltrim($className, "\\")) { $name = $method->name;