Skip to content

Commit e2c342c

Browse files
committed
Refactoring MyCLabsEnum type
1 parent 7f1ce16 commit e2c342c

File tree

4 files changed

+66
-37
lines changed

4 files changed

+66
-37
lines changed

src/Mappers/Root/MyCLabsEnumTypeMapper.php

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use phpDocumentor\Reflection\Type;
1515
use phpDocumentor\Reflection\Types\Object_;
1616
use ReflectionMethod;
17-
use TheCodingMachine\GraphQLite\Types\MyclabsEnumType;
17+
use TheCodingMachine\GraphQLite\Types\MyCLabsEnumType;
1818
use function is_a;
1919
use function str_replace;
2020
use function strpos;
@@ -88,16 +88,7 @@ private function mapByClassName(string $enumClass): ?EnumType
8888
return $this->cache[$enumClass];
8989
}
9090

91-
$consts = $enumClass::toArray();
92-
$constInstances = [];
93-
foreach ($consts as $key => $value) {
94-
$constInstances[$key] = ['value' => $enumClass::$key()];
95-
}
96-
97-
return $this->cache[$enumClass] = new MyclabsEnumType([
98-
'name' => 'MyCLabsEnum_' . str_replace('\\', '__', $enumClass),
99-
'values' => $constInstances,
100-
]);
91+
return $this->cache[$enumClass] = new MyCLabsEnumType($enumClass);
10192
}
10293

10394
/**

src/Types/MyCLabsEnumType.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TheCodingMachine\GraphQLite\Types;
6+
7+
use GraphQL\Type\Definition\EnumType;
8+
use InvalidArgumentException;
9+
use MyCLabs\Enum\Enum;
10+
use function str_replace;
11+
12+
/**
13+
* An extension of the EnumType to support Myclabs enum.
14+
*
15+
* This implementation is needed to overwrite the default "serialize" method, that expects to see the exact same object
16+
* (while there can be several instances of the same enum value with MyclabsEnum)
17+
*/
18+
class MyCLabsEnumType extends EnumType
19+
{
20+
public function __construct(string $enumClassName)
21+
{
22+
$consts = $enumClassName::toArray();
23+
$constInstances = [];
24+
foreach ($consts as $key => $value) {
25+
$constInstances[$key] = ['value' => $enumClassName::$key()];
26+
}
27+
28+
parent::__construct([
29+
'name' => 'MyCLabsEnum_' . str_replace('\\', '__', $enumClassName),
30+
'values' => $constInstances,
31+
]);
32+
}
33+
34+
/**
35+
* @param mixed $value
36+
*
37+
* @return mixed
38+
*/
39+
public function serialize($value)
40+
{
41+
if (! $value instanceof Enum) {
42+
throw new InvalidArgumentException('Expected a Myclabs Enum instance');
43+
}
44+
return $value->getKey();
45+
}
46+
}

src/Types/MyclabsEnumType.php

Lines changed: 0 additions & 26 deletions
This file was deleted.

tests/Types/MyclabsEnumTypeTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace TheCodingMachine\GraphQLite\Types;
4+
5+
use InvalidArgumentException;
6+
use PHPUnit\Framework\TestCase;
7+
use TheCodingMachine\GraphQLite\Fixtures\Integration\Models\ProductTypeEnum;
8+
9+
class MyclabsEnumTypeTest extends TestCase
10+
{
11+
public function testException()
12+
{
13+
$enumType = new MyCLabsEnumType(ProductTypeEnum::class);
14+
$this->expectException(InvalidArgumentException::class);
15+
$this->expectExceptionMessage('Expected a Myclabs Enum instance');
16+
$enumType->serialize('foo');
17+
}
18+
}

0 commit comments

Comments
 (0)