Skip to content

Commit

Permalink
Merge pull request #13 from TomHAnderson/feature/di-hydrators
Browse files Browse the repository at this point in the history
Use DI for all hydrators
  • Loading branch information
TomHAnderson committed Jan 30, 2022
2 parents 48df2d3 + 6b10040 commit 62438d1
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/HydratorManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;

use function app;
use function collect;
use function get_class;
use function is_object;
Expand Down Expand Up @@ -73,9 +74,11 @@ public function extract(mixed $class, ?string $overrideHydrator = null): Collect
throw new Exception\NoHydrator(get_class($class));
}

// Use DI for hydrators
$extractorClass = $overrideHydrator ?: $this->classHydrators[get_class($class)];
$hydrator = app($extractorClass);

return (new $extractorClass())->setHydratorManager($this)->extract($class);
return $hydrator->setHydratorManager($this)->extract($class);
}

/**
Expand Down
14 changes: 14 additions & 0 deletions test/HydratorManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@

use ApiSkeletons\Laravel\HAL\Exception\NoHydrator;
use ApiSkeletons\Laravel\HAL\Resource;
use ApiSkeletonsTest\Laravel\HAL\Hydrator\DiHydrator;
use ApiSkeletonsTest\Laravel\HAL\Model\User;
use Illuminate\Foundation\Application;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use PHPUnit\Framework\TestCase;
Expand Down Expand Up @@ -53,6 +55,18 @@ public function testExtract(): void
$this->assertEquals('https://test/user/1', $array['_links']['self']['href']);
}

public function testDiExtract(): void
{
$hydratorManager = new HydratorManager();
$user = new User();

$resource = $hydratorManager->extract($user, DiHydrator::class);
$this->assertInstanceOf(Resource::class, $resource);

$array = $resource->toArray();
$this->assertEquals(Application::class, $array['app']);
}

public function testNoHydratorInExtract(): void
{
$this->expectException(NoHydrator::class);
Expand Down
31 changes: 31 additions & 0 deletions test/src/Hydrator/DiHydrator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

declare(strict_types=1);

namespace ApiSkeletonsTest\Laravel\HAL\Hydrator;

use ApiSkeletons\Laravel\HAL\Hydrator;
use ApiSkeletons\Laravel\HAL\Resource;
use Illuminate\Foundation\Application;

use function get_class;

final class DiHydrator extends Hydrator
{
private Application $app;

public function __construct(Application $app)
{
$this->app = $app;
}

/** {@inheritdoc} */
public function extract($class): Resource
{
$data = [
'app' => get_class($this->app),
];

return $this->hydratorManager->resource($data);
}
}

0 comments on commit 62438d1

Please sign in to comment.