Skip to content

Commit 6b10040

Browse files
committed
Use DI for all hydrators
1 parent 48df2d3 commit 6b10040

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

src/HydratorManager.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Illuminate\Pagination\LengthAwarePaginator;
99
use Illuminate\Support\Collection;
1010

11+
use function app;
1112
use function collect;
1213
use function get_class;
1314
use function is_object;
@@ -73,9 +74,11 @@ public function extract(mixed $class, ?string $overrideHydrator = null): Collect
7374
throw new Exception\NoHydrator(get_class($class));
7475
}
7576

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

78-
return (new $extractorClass())->setHydratorManager($this)->extract($class);
81+
return $hydrator->setHydratorManager($this)->extract($class);
7982
}
8083

8184
/**

test/HydratorManagerTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

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

58+
public function testDiExtract(): void
59+
{
60+
$hydratorManager = new HydratorManager();
61+
$user = new User();
62+
63+
$resource = $hydratorManager->extract($user, DiHydrator::class);
64+
$this->assertInstanceOf(Resource::class, $resource);
65+
66+
$array = $resource->toArray();
67+
$this->assertEquals(Application::class, $array['app']);
68+
}
69+
5670
public function testNoHydratorInExtract(): void
5771
{
5872
$this->expectException(NoHydrator::class);

test/src/Hydrator/DiHydrator.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ApiSkeletonsTest\Laravel\HAL\Hydrator;
6+
7+
use ApiSkeletons\Laravel\HAL\Hydrator;
8+
use ApiSkeletons\Laravel\HAL\Resource;
9+
use Illuminate\Foundation\Application;
10+
11+
use function get_class;
12+
13+
final class DiHydrator extends Hydrator
14+
{
15+
private Application $app;
16+
17+
public function __construct(Application $app)
18+
{
19+
$this->app = $app;
20+
}
21+
22+
/** {@inheritdoc} */
23+
public function extract($class): Resource
24+
{
25+
$data = [
26+
'app' => get_class($this->app),
27+
];
28+
29+
return $this->hydratorManager->resource($data);
30+
}
31+
}

0 commit comments

Comments
 (0)