Skip to content

Commit 67b5a6f

Browse files
authored
Integration myclabs/php-enum (#46)
* Add integration with myclabs/php-enum * Added documentation about integration with myclabs/php-enum
1 parent 7725cf1 commit 67b5a6f

13 files changed

+340
-3
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ See examples from [test suite](tests/Fixtures) & associated [tests](tests/EnumsF
184184

185185
- Creating [enums](docs/creating-enum.md)
186186
- Creating [translated enums](docs/creating-translated-enum.md)
187+
- Integration with [myclabs/php-enum](docs/myclabs-enum-integration.md)
187188
- Migrating [from standard Symfony](docs/migrating-from-symfony-standard.md)
188189
- Integration with [SonataAdminBundle](docs/sonata-admin-integration.md)
189190

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,17 @@
1515
},
1616
"require-dev": {
1717
"doctrine/annotations": "^1.3",
18+
"myclabs/php-enum": "^1.8",
1819
"phpspec/prophecy-phpunit": "^2.0",
1920
"phpunit/phpunit": "^9.4",
2021
"squizlabs/php_codesniffer": "^3.5",
2122
"symfony/form": "^4.4|^5.0",
22-
"symfony/framework-bundle": "^4.4|^5.0",
2323
"symfony/twig-bundle": "^4.4|^5.0",
2424
"symfony/validator": "^4.4|^5.0",
2525
"twig/twig": "^2.0|^3.0"
2626
},
2727
"suggest": {
28+
"myclabs/php-enum": "Integrate with enum object",
2829
"symfony/framework-bundle": "Integrate with Symfony Framework",
2930
"symfony/form": "Add enum form type",
3031
"symfony/validator": "Add enum validation",

docs/myclabs-enum-integration.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# myclabs/php-enum integration
2+
3+
Let say that you already has such enum, from [myclabs/php-enum](https://github.com/myclabs/php-enum).
4+
5+
```php
6+
<?php
7+
8+
declare(strict_types=1);
9+
10+
namespace App\Model;
11+
12+
use MyCLabs\Enum\Enum;
13+
14+
/**
15+
* @method static self NEW
16+
* @method static self VALIDATED
17+
* @method static self DISABLED
18+
*/
19+
class MemberStatus extends Enum
20+
{
21+
private const NEW = 'new';
22+
private const VALIDATED = 'validated';
23+
private const DISABLED = 'disabled';
24+
}
25+
```
26+
27+
## Standard enum
28+
29+
If you want to integrate with the bundle, you just have to declare an enum for that class.
30+
31+
```php
32+
<?php
33+
34+
declare(strict_types=1);
35+
36+
namespace App\Enum;
37+
38+
use App\Model\MemberStatus;
39+
use Yokai\EnumBundle\MyCLabsEnum;
40+
41+
class StatusEnum extends MyCLabsEnum
42+
{
43+
public function __construct()
44+
{
45+
parent::__construct(MemberStatus::class);
46+
}
47+
}
48+
```
49+
50+
## Translated enum
51+
52+
Or if you want to translate enum constant labels.
53+
54+
```php
55+
<?php
56+
57+
declare(strict_types=1);
58+
59+
namespace App\Enum;
60+
61+
use App\Model\MemberStatus;
62+
use Symfony\Contracts\Translation\TranslatorInterface;
63+
use Yokai\EnumBundle\MyCLabsTranslatedEnum;
64+
65+
class StatusEnum extends MyCLabsTranslatedEnum
66+
{
67+
public function __construct(TranslatorInterface $translator)
68+
{
69+
parent::__construct(MemberStatus::class, $translator, 'status.%s');
70+
}
71+
}
72+
```

src/Exception/LogicException.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,12 @@ public static function alreadyRegistered(string $name): self
3030
$name
3131
));
3232
}
33+
34+
public static function invalidMyClabsEnumClass(string $enum): self
35+
{
36+
return new self(sprintf(
37+
'Enum class must be valid "myclabs/php-enum" enum class. Got "%s".',
38+
$enum
39+
));
40+
}
3341
}

src/MyCLabsEnum.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 Yokai\EnumBundle;
6+
7+
use MyCLabs\Enum\Enum as ActualMyCLabsEnum;
8+
use Yokai\EnumBundle\Exception\LogicException;
9+
10+
/**
11+
* @author Yann Eugoné <[email protected]>
12+
*/
13+
class MyCLabsEnum extends Enum
14+
{
15+
/**
16+
* @param string $enum
17+
* @param string|null $name
18+
*/
19+
public function __construct(string $enum, string $name = null)
20+
{
21+
if (!\is_a($enum, ActualMyCLabsEnum::class, true)) {
22+
throw LogicException::invalidMyClabsEnumClass($enum);
23+
}
24+
25+
if ($name === null && static::class === __CLASS__) {
26+
$name = $enum;
27+
}
28+
29+
parent::__construct($enum::values(), $name);
30+
}
31+
}

src/MyCLabsTranslatedEnum.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle;
6+
7+
use MyCLabs\Enum\Enum as ActualMyCLabsEnum;
8+
use Symfony\Contracts\Translation\TranslatorInterface;
9+
use Yokai\EnumBundle\Exception\LogicException;
10+
11+
/**
12+
* @author Yann Eugoné <[email protected]>
13+
*/
14+
class MyCLabsTranslatedEnum extends TranslatedEnum
15+
{
16+
/**
17+
* @param string $enum
18+
* @param TranslatorInterface $translator
19+
* @param string $transPattern
20+
* @param string $transDomain
21+
* @param string|null $name
22+
*/
23+
public function __construct(
24+
string $enum,
25+
TranslatorInterface $translator,
26+
string $transPattern,
27+
string $transDomain = 'messages',
28+
string $name = null
29+
) {
30+
if (!\is_a($enum, ActualMyCLabsEnum::class, true)) {
31+
throw LogicException::invalidMyClabsEnumClass($enum);
32+
}
33+
34+
if ($name === null && static::class === __CLASS__) {
35+
$name = $enum;
36+
}
37+
38+
parent::__construct($enum::values(), $translator, $transPattern, $transDomain, $name);
39+
}
40+
}

tests/EnumsFromFixturesTest.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
use Generator;
88
use PHPUnit\Framework\TestCase;
99
use Yokai\EnumBundle\EnumInterface;
10+
use Yokai\EnumBundle\Tests\Fixtures\Action;
11+
use Yokai\EnumBundle\Tests\Fixtures\ActionEnum;
1012
use Yokai\EnumBundle\Tests\Fixtures\StateEnum;
13+
use Yokai\EnumBundle\Tests\Fixtures\Status;
14+
use Yokai\EnumBundle\Tests\Fixtures\StatusEnum;
1115
use Yokai\EnumBundle\Tests\Fixtures\SubscriptionEnum;
1216
use Yokai\EnumBundle\Tests\Fixtures\TypeEnum;
1317
use Yokai\EnumBundle\Tests\Fixtures\Vehicle;
@@ -27,21 +31,36 @@ class EnumsFromFixturesTest extends TestCase
2731
public function testEnum(EnumInterface $enum, string $name, array $choices): void
2832
{
2933
self::assertSame($name, $enum->getName());
30-
self::assertSame($choices, $enum->getChoices());
31-
self::assertSame(\array_values($choices), $enum->getValues());
34+
self::assertEquals($choices, $enum->getChoices());
35+
self::assertEquals(\array_values($choices), $enum->getValues());
3236
foreach ($choices as $label => $value) {
3337
self::assertSame($label, $enum->getLabel($value));
3438
}
3539
}
3640

3741
public function enums(): Generator
3842
{
43+
yield ActionEnum::class . ' : myclabs/php-enum translated enum' => [
44+
new ActionEnum(new Translator([
45+
'action.VIEW' => 'Voir',
46+
'action.EDIT' => 'Modifier',
47+
])),
48+
ActionEnum::class,
49+
['Voir' => Action::VIEW(), 'Modifier' => Action::EDIT()]
50+
];
51+
3952
yield StateEnum::class . ' : direct interface implementation' => [
4053
new StateEnum(),
4154
StateEnum::class,
4255
['New' => 'new', 'Validated' => 'validated', 'Disabled' => 'disabled']
4356
];
4457

58+
yield StatusEnum::class . ' : myclabs/php-enum enum' => [
59+
new StatusEnum(),
60+
StatusEnum::class,
61+
['SUCCESS' => Status::SUCCESS(), 'ERROR' => Status::ERROR()]
62+
];
63+
4564
yield SubscriptionEnum::class . ' : translated enum with keyword name' => [
4665
new SubscriptionEnum(new Translator([
4766
'choice.subscription.none' => 'Aucune',

tests/Fixtures/Action.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle\Tests\Fixtures;
6+
7+
use MyCLabs\Enum\Enum;
8+
9+
/**
10+
* Enum from "myclabs/php-enum".
11+
*
12+
* @method static self VIEW
13+
* @method static self EDIT
14+
*
15+
* @author Yann Eugoné <[email protected]>
16+
*/
17+
class Action extends Enum
18+
{
19+
private const VIEW = 'view';
20+
private const EDIT = 'edit';
21+
}

tests/Fixtures/ActionEnum.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle\Tests\Fixtures;
6+
7+
use Symfony\Contracts\Translation\TranslatorInterface;
8+
use Yokai\EnumBundle\MyCLabsTranslatedEnum;
9+
10+
/**
11+
* @author Yann Eugoné <[email protected]>
12+
*/
13+
class ActionEnum extends MyCLabsTranslatedEnum
14+
{
15+
public function __construct(TranslatorInterface $translator)
16+
{
17+
parent::__construct(Action::class, $translator, 'action.%s');
18+
}
19+
}

tests/Fixtures/Status.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\EnumBundle\Tests\Fixtures;
6+
7+
use MyCLabs\Enum\Enum;
8+
9+
/**
10+
* Enum from "myclabs/php-enum".
11+
*
12+
* @method static self SUCCESS
13+
* @method static self ERROR
14+
*
15+
* @author Yann Eugoné <[email protected]>
16+
*/
17+
class Status extends Enum
18+
{
19+
private const SUCCESS = 0;
20+
private const ERROR = 1;
21+
}

0 commit comments

Comments
 (0)