Skip to content

Commit 9b8b058

Browse files
committed
Code review
1 parent 626fc10 commit 9b8b058

File tree

4 files changed

+163
-32
lines changed

4 files changed

+163
-32
lines changed

README.md

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ $ composer require yokai/enum-bundle
2525

2626
### Enable the bundle in the kernel
2727

28-
``` php
28+
```php
2929
<?php
3030
// config/bundles.php
3131

@@ -39,16 +39,17 @@ return [
3939
Usage
4040
-----
4141

42-
Let's take an example : our application has some members and each member has a `gender` which can be "male" (`m`) or "female" (`f`).
42+
Let's take an example : our application has some members
43+
and each member has a `gender` which can be "male" (`m`) or "female" (`f`).
4344

4445
We first need to create the classes that will handle our enums :
4546

4647
> **Note** this example is optimized for latest versions of Symfony, you will find more in dedicated doc file.
4748
48-
``` php
49+
```php
4950
<?php
50-
// src/App/Enum/Member/GenderEnum.php
51-
namespace App\Enum\Member;
51+
// src/App/Enum/GenderEnum.php
52+
namespace App\Enum;
5253

5354
use Yokai\EnumBundle\Enum\EnumInterface;
5455
use Yokai\EnumBundle\Enum\EnumWithClassAsNameTrait;
@@ -64,16 +65,17 @@ class GenderEnum implements EnumInterface
6465
}
6566
```
6667

67-
If you are using PSR-4 service discovery, then your service is already registered.
68+
If you are using [PSR-4 service discovery](https://symfony.com/blog/new-in-symfony-3-3-psr-4-based-service-discovery),
69+
then your service is already registered.
6870

6971
That's it, now the bundle know your enum services. You can start using it.
7072

7173
Adding validation to your model :
7274

73-
``` php
75+
```php
7476
<?php
75-
// src/AppBundle/Model/Member.php
76-
namespace AppBundle\Model;
77+
// src/App/Model/Member.php
78+
namespace App\Model;
7779

7880
use Yokai\EnumBundle\Validator\Constraints\Enum;
7981

@@ -82,22 +84,24 @@ class Member
8284
/**
8385
* @var string
8486
*
85-
* @Enum("App\Enum\Member\GenderEnum")
87+
* @Enum("App\Enum\GenderEnum")
8688
*/
8789
protected $gender;
8890
}
8991
```
9092

9193
Adding enum form types :
9294

93-
``` php
95+
```php
9496
<?php
95-
// src/AppBundle/Form/Type/MemberType.php
96-
namespace AppBundle\Form\Type;
97+
// src/App/Form/Type/MemberType.php
98+
namespace App\Form\Type;
9799

98-
use AppBundle\Enum\GenderEnum;
99-
use AppBundle\Enum\StateEnum;
100+
use App\Enum\GenderEnum;
100101
use Symfony\Component\Form\AbstractType;
102+
use Symfony\Component\Form\FormBuilderInterface;
103+
// For Symfony >= 2.8
104+
use Yokai\EnumBundle\Form\Type\EnumType;
101105

102106
class MemberType extends AbstractType
103107
{
@@ -106,6 +110,12 @@ class MemberType extends AbstractType
106110
$builder
107111
// Let the bundle guess the form type for you (requires that you configured the validation)
108112
->add('gender')
113+
114+
// Manual form type binding for Symfony >= 2.8
115+
->add('gender', EnumType::class, ['enum' => GenderEnum::class])
116+
117+
// Manual form type binding for Symfony 2.7
118+
->add('gender', 'enum', ['enum' => GenderEnum::class])
109119
;
110120
}
111121
}
@@ -114,15 +124,15 @@ class MemberType extends AbstractType
114124
Displaying the label for an enum value within a template :
115125

116126
```twig
117-
{{ value|enum_label(constant('AppBundle\\Enum\\Member\\GenderEnum')) }}
127+
{{ value|enum_label('App\\Enum\\GenderEnum') }}
118128
```
119129

120130

121131
Recipes
122-
------------
132+
-------
123133

124134
- Usage in [SonataAdminBundle](https://github.com/sonata-project/SonataAdminBundle) : see [doc](Resources/doc/sonata-admin.md)
125-
- All the ways to [declare enums](Resources/doc/declaring-enum.md)
135+
- All the ways to declare [enums](Resources/doc/declaring-enum.md) or [translated enums](Resources/doc/declaring-translated-enum.md)
126136

127137

128138
MIT License
@@ -136,3 +146,7 @@ Authors
136146

137147
The bundle was originally created by [Yann Eugoné](https://github.com/yann-eugone).
138148
See the list of [contributors](https://github.com/yokai-php/enum-bundle/contributors).
149+
150+
---
151+
152+
Thank's to [Prestaconcept](https://github.com/prestaconcept) for supporting this bundle.

Resources/doc/declaring-enum.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ Declaring enum
33

44
An enum is nothing more than a class with 2 methods : `getName` & `getChoices`, registered as a service.
55

6-
There is a lot of way to create and declare such classes
6+
There is a lot of way to create and declare such classes.
7+
8+
> **Note :** If you wish to declare translation based enum,
9+
> please see [dedicated documentation](declaring-translated-enum.md)
710
811

912
The classic way
10-
-----
13+
---------------
1114

1215
Create a new class, implement both `getName` & `getChoices` methods.
1316

@@ -34,7 +37,7 @@ class GenderEnum implements EnumInterface
3437

3538
Define an enum service for it.
3639

37-
``` yaml
40+
```yaml
3841
services:
3942
enum.member.gender:
4043
class: 'App\Enum\GenderEnum'
@@ -44,7 +47,7 @@ services:
4447
4548
4649
The class as name way
47-
-----
50+
---------------------
4851
4952
Create a new class, use `EnumWithClassAsNameTrait` trait and implement `getChoices` methods.
5053

@@ -69,7 +72,7 @@ class GenderEnum implements EnumInterface
6972

7073
Define an enum service for it.
7174

72-
``` yaml
75+
```yaml
7376
services:
7477
enum.member.gender:
7578
class: 'App\Enum\GenderEnum'
@@ -79,11 +82,11 @@ services:
7982

8083

8184
The configurable way
82-
-----
85+
--------------------
8386

8487
No need for a class, just use the `ConfigurableEnum` class and define a new enum service.
8588

86-
``` yaml
89+
```yaml
8790
services:
8891
enum.member.gender:
8992
class: 'Yokai\EnumBundle\Enum\ConfigurableEnum'
@@ -94,4 +97,3 @@ services:
9497
- m: 'Male'
9598
f: 'Female'
9699
```
97-
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
Declaring translated enum
2+
=========================
3+
4+
If you wish to use Symfony's Translator for your enum labels, this bundle provide base classes to ease integration.
5+
6+
There is a lot of way to create and declare such classes.
7+
8+
> **Note :** It is pretty much like [declaring classic enums](declaring-enum.md),
9+
> but with a `extends` instead of an `implements`.
10+
11+
12+
The classic way
13+
---------------
14+
15+
Create a new class, implement both `getName` & `getValues` methods and specify the translation pattern.
16+
17+
```php
18+
<?php
19+
20+
namespace App\Enum;
21+
22+
use Symfony\Component\Translation\TranslatorInterface;
23+
use Yokai\EnumBundle\Enum\AbstractTranslatedEnum;
24+
25+
class GenderEnum extends AbstractTranslatedEnum
26+
{
27+
public function __construct(TranslatorInterface $translator)
28+
{
29+
parent::__construct($translator, 'enum.gender.%s');
30+
}
31+
32+
public function getName()
33+
{
34+
return 'gender';
35+
}
36+
37+
public function getValues()
38+
{
39+
return ['m', 'f'];
40+
}
41+
}
42+
```
43+
44+
Define an enum service for it.
45+
46+
```yaml
47+
services:
48+
enum.member.gender:
49+
class: 'App\Enum\GenderEnum'
50+
public: false
51+
tags: ['enum']
52+
arguments:
53+
- "@translator"
54+
```
55+
56+
57+
The class as name way
58+
---------------------
59+
60+
Create a new class, use `EnumWithClassAsNameTrait` trait, implement `getValues` methods and specify the translation pattern.
61+
62+
```php
63+
<?php
64+
65+
namespace App\Enum;
66+
67+
use Symfony\Component\Translation\TranslatorInterface;
68+
use Yokai\EnumBundle\Enum\AbstractTranslatedEnum;
69+
use Yokai\EnumBundle\Enum\EnumWithClassAsNameTrait;
70+
71+
class GenderEnum extends AbstractTranslatedEnum
72+
{
73+
use EnumWithClassAsNameTrait;
74+
75+
public function __construct(TranslatorInterface $translator)
76+
{
77+
parent::__construct($translator, 'enum.gender.%s');
78+
}
79+
80+
public function getValues()
81+
{
82+
return ['m', 'f'];
83+
}
84+
}
85+
```
86+
87+
Define an enum service for it.
88+
89+
```yaml
90+
services:
91+
enum.member.gender:
92+
class: 'App\Enum\GenderEnum'
93+
public: false
94+
tags: ['enum']
95+
arguments:
96+
- "@translator"
97+
```
98+
99+
100+
The configurable way
101+
--------------------
102+
103+
No need for a class, just use the `ConfigurableTranslatedEnum` class and define a new enum service.
104+
105+
```yaml
106+
services:
107+
enum.member.gender:
108+
class: 'Yokai\EnumBundle\Enum\ConfigurableTranslatedEnum'
109+
public: false
110+
tags: ['enum']
111+
arguments:
112+
- "@translator"
113+
- "enum.gender.%s"
114+
- "gender"
115+
- ['m', 'f']
116+
```

Resources/doc/sonata-admin.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ And let's say we want to build a SonataAdmin for this model.
1212
namespace App\Admin;
1313

1414
use App\Enum\GenderEnum;
15-
use Yokai\EnumBundle\Form\Type\EnumType;
1615
use Sonata\AdminBundle\Datagrid\DatagridMapper;
1716
use Sonata\AdminBundle\Datagrid\ListMapper;
1817
use Sonata\AdminBundle\Form\FormMapper;
1918
use Sonata\AdminBundle\Show\ShowMapper;
19+
use Yokai\EnumBundle\Form\Type\EnumType;
2020

2121
class MemberAdmin extends AbstractAdmin
2222
{
@@ -46,9 +46,8 @@ class MemberAdmin extends AbstractAdmin
4646
protected function configureFormFields(FormMapper $form)
4747
{
4848
$form
49-
->add('gender', EnumType::class, [
50-
'enum' => GenderEnum::NAME,
51-
])
49+
// Let the bundle guess the form type for you (requires that you configured the validation)
50+
->add('gender')
5251
//...
5352
;
5453
}
@@ -72,7 +71,7 @@ class MemberAdmin extends AbstractAdmin
7271
{% extends admin.getTemplate('base_list_field') %}
7372
7473
{% block field %}
75-
{{ value|enum_label(constant('AppBundle\\Enum\\Member\\GenderEnum')) }}
74+
{{ value|enum_label('App\\Enum\\GenderEnum') }}
7675
{% endblock %}
7776
```
7877

@@ -83,6 +82,6 @@ class MemberAdmin extends AbstractAdmin
8382
{% extends admin.getTemplate('base_show_field') %}
8483
8584
{% block field %}
86-
{{ value|enum_label(constant('AppBundle\\Enum\\Member\\GenderEnum')) }}
85+
{{ value|enum_label('App\\Enum\\GenderEnum') }}
8786
{% endblock %}
8887
```

0 commit comments

Comments
 (0)