From 30dc9bf06f9b839ad1bd8314025f2584e92d16b8 Mon Sep 17 00:00:00 2001 From: Mohammad Alavi Date: Mon, 27 Jan 2025 13:22:15 +0330 Subject: [PATCH] feat: allow overriding resource classes (#84) --- src/Fractal.php | 23 ++++++++++++++++++----- tests/FractalTest.php | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/Fractal.php b/src/Fractal.php index 5efea17..78a16a4 100644 --- a/src/Fractal.php +++ b/src/Fractal.php @@ -410,24 +410,37 @@ public function createData() } /** - * Get the resource. + * Get the resource class. * - * @return \League\Fractal\Resource\ResourceInterface + * @return string * * @throws \Spatie\Fractalistic\Exceptions\InvalidTransformation */ - public function getResource() + public function getResourceClass(): string { - $resourceClass = 'League\\Fractal\\Resource\\'.ucfirst($this->dataType); + $class = 'League\\Fractal\\Resource\\'.ucfirst($this->dataType); - if (! class_exists($resourceClass)) { + if (! class_exists($class)) { throw new InvalidTransformation(); } + return $class; + } + + /** + * Get the resource. + * + * @return \League\Fractal\Resource\ResourceInterface + * + * @throws \Spatie\Fractalistic\Exceptions\InvalidTransformation + */ + public function getResource() + { if (is_string($this->transformer)) { $this->transformer = new $this->transformer; } + $resourceClass = $this->getResourceClass(); $resource = new $resourceClass($this->data, $this->transformer, $this->resourceName); $resource->setMeta($this->meta); diff --git a/tests/FractalTest.php b/tests/FractalTest.php index af5753a..48bb42d 100644 --- a/tests/FractalTest.php +++ b/tests/FractalTest.php @@ -1,6 +1,9 @@ item([])->transformWith(new TestTransformer()); + expect($resource->getResourceClass())->toBe(Item::class); + + $resource = Fractal::create('test', new TestTransformer()); + expect($resource->getResourceClass())->toBe(Item::class); + + $resource = Fractal::create()->collection([])->transformWith(new TestTransformer()); + expect($resource->getResourceClass())->toBe(Collection::class); + + $resource = Fractal::create([], new TestTransformer()); + expect($resource->getResourceClass())->toBe(Collection::class); + + $resource = Fractal::create(null, new TestTransformer()); + expect($resource->getResourceClass())->toBe(NullResource::class); +});