Skip to content

Commit

Permalink
feat: allow overriding resource classes (#84)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mohammad-Alavi authored Jan 27, 2025
1 parent 3b38474 commit 30dc9bf
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 5 deletions.
23 changes: 18 additions & 5 deletions src/Fractal.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
20 changes: 20 additions & 0 deletions tests/FractalTest.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<?php

use League\Fractal\Pagination\Cursor;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\Resource\NullResource;
use League\Fractal\Resource\ResourceInterface;
use League\Fractal\Serializer\JsonApiSerializer;
use Spatie\Fractalistic\ArraySerializer;
Expand Down Expand Up @@ -252,3 +255,20 @@ function (): array {
null,
]
]);

it('can locate default resource classes', function (): void {
$resource = Fractal::create()->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);
});

0 comments on commit 30dc9bf

Please sign in to comment.