Skip to content

Commit 626fc10

Browse files
committed
Added documentation about all the way to declare enums, removed all fashioned ways to use enums from the README
1 parent 556a4d9 commit 626fc10

File tree

4 files changed

+130
-131
lines changed

4 files changed

+130
-131
lines changed

DependencyInjection/EnumExtension.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Symfony\Component\DependencyInjection\ContainerBuilder;
77
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
88
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
9+
use Yokai\EnumBundle\Enum\EnumInterface;
910

1011
/**
1112
* @author Yann Eugoné <[email protected]>
@@ -27,5 +28,10 @@ public function load(array $configs, ContainerBuilder $container)
2728
$xmlLoader->load('forms.xml');
2829
$xmlLoader->load('validators.xml');
2930
$xmlLoader->load('twig.xml');
31+
32+
if (method_exists($container, 'registerForAutoconfiguration')) {
33+
$container->registerForAutoconfiguration(EnumInterface::class)
34+
->addTag('enum');
35+
}
3036
}
3137
}

README.md

Lines changed: 17 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -20,98 +20,51 @@ Installation
2020
### Add the bundle as dependency with Composer
2121

2222
``` bash
23-
$ php composer.phar require yokai/enum-bundle
23+
$ composer require yokai/enum-bundle
2424
```
2525

2626
### Enable the bundle in the kernel
2727

2828
``` php
2929
<?php
30-
// app/AppKernel.php
30+
// config/bundles.php
3131

32-
public function registerBundles()
33-
{
34-
$bundles = [
32+
return [
3533
// ...
36-
new Yokai\EnumBundle\YokaiEnumBundle(),
37-
];
38-
}
34+
Yokai\EnumBundle\YokaiEnumBundle::class => ['all' => true],
35+
];
3936
```
4037

4138

4239
Usage
4340
-----
4441

45-
Let's take an example : our application has some members and each member has a `gender` and a `state`.
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`).
4643

4744
We first need to create the classes that will handle our enums :
4845

46+
> **Note** this example is optimized for latest versions of Symfony, you will find more in dedicated doc file.
47+
4948
``` php
5049
<?php
51-
// src/AppBundle/Enum/Member/GenderEnum.php
52-
namespace AppBundle\Enum\Member;
50+
// src/App/Enum/Member/GenderEnum.php
51+
namespace App\Enum\Member;
5352

5453
use Yokai\EnumBundle\Enum\EnumInterface;
54+
use Yokai\EnumBundle\Enum\EnumWithClassAsNameTrait;
5555

5656
class GenderEnum implements EnumInterface
5757
{
58-
const NAME = 'member.gender';
58+
use EnumWithClassAsNameTrait;
5959

6060
public function getChoices()
6161
{
62-
return ['male' => 'Male', 'female' => 'Female'];
63-
}
64-
65-
public function getName()
66-
{
67-
return static::NAME;
68-
}
69-
}
70-
```
71-
72-
``` php
73-
<?php
74-
// src/AppBundle/Enum/Member/StateEnum.php
75-
namespace AppBundle\Enum\Member;
76-
77-
use Yokai\EnumBundle\Enum\AbstractTranslatedEnum;
78-
79-
class StateEnum extends AbstractTranslatedEnum
80-
{
81-
const NAME = 'member.state';
82-
83-
protected function getValues()
84-
{
85-
return ['new', 'validated', 'disabled'];
86-
}
87-
88-
public function getName()
89-
{
90-
return static::NAME;
62+
return ['m' => 'Male', 'f' => 'Female'];
9163
}
9264
}
9365
```
9466

95-
Then we must declare these classes as services :
96-
97-
``` xml
98-
<!-- src/AppBundle/Resources/config/services.xml -->
99-
<services>
100-
<!-- ... -->
101-
102-
<service id="enum.member.gender" class="AppBundle\Enum\Member\GenderEnum" public="false">
103-
<tag name="enum"/>
104-
</service>
105-
106-
<service id="enum.member.state" class="AppBundle\Enum\Member\StateEnum"
107-
parent="enum.abstract_translated" public="false">
108-
<argument>choice.member.state.%s</argument>
109-
110-
<tag name="enum"/>
111-
</service>
112-
113-
</services>
114-
```
67+
If you are using PSR-4 service discovery, then your service is already registered.
11568

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

@@ -126,23 +79,12 @@ use Yokai\EnumBundle\Validator\Constraints\Enum;
12679

12780
class Member
12881
{
129-
//...
130-
13182
/**
13283
* @var string
13384
*
134-
* @Enum("member.state")
135-
*/
136-
protected $state;
137-
138-
/**
139-
* @var string
140-
*
141-
* @Enum("member.gender")
85+
* @Enum("App\Enum\Member\GenderEnum")
14286
*/
14387
protected $gender;
144-
145-
//...
14688
}
14789
```
14890

@@ -156,43 +98,31 @@ namespace AppBundle\Form\Type;
15698
use AppBundle\Enum\GenderEnum;
15799
use AppBundle\Enum\StateEnum;
158100
use Symfony\Component\Form\AbstractType;
159-
// For Symfony >= 2.8
160-
use Yokai\EnumBundle\Form\Type\EnumType;
161101

162102
class MemberType extends AbstractType
163103
{
164104
public function buildForm(FormBuilderInterface $builder, array $options)
165105
{
166106
$builder
167107
// Let the bundle guess the form type for you (requires that you configured the validation)
168-
->add('state')
169108
->add('gender')
170-
171-
// Manual form type binding for Symfony >= 2.8
172-
->add('state', EnumType::class, ['enum' => StateEnum::NAME])
173-
->add('gender', EnumType::class, ['enum' => GenderEnum::NAME])
174-
175-
// Manual form type binding for Symfony 2.7
176-
->add('state', 'enum', ['enum' => StateEnum::NAME])
177-
->add('gender', 'enum', ['enum' => GenderEnum::NAME])
178109
;
179110
}
180111
}
181112
```
182113

183-
184114
Displaying the label for an enum value within a template :
185115

186116
```twig
187-
{{ value|enum_label(constant('AppBundle\\Enum\\Member\\StateEnum::NAME')) }}
188-
{{ value|enum_label(constant('AppBundle\\Enum\\Member\\GenderEnum::NAME')) }}
117+
{{ value|enum_label(constant('AppBundle\\Enum\\Member\\GenderEnum')) }}
189118
```
190119

191120

192121
Recipes
193122
------------
194123

195124
- 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)
196126

197127

198128
MIT License

Resources/doc/declaring-enum.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
Declaring enum
2+
==============
3+
4+
An enum is nothing more than a class with 2 methods : `getName` & `getChoices`, registered as a service.
5+
6+
There is a lot of way to create and declare such classes
7+
8+
9+
The classic way
10+
-----
11+
12+
Create a new class, implement both `getName` & `getChoices` methods.
13+
14+
```php
15+
<?php
16+
17+
namespace App\Enum;
18+
19+
use Yokai\EnumBundle\Enum\EnumInterface;
20+
21+
class GenderEnum implements EnumInterface
22+
{
23+
public function getName()
24+
{
25+
return 'gender';
26+
}
27+
28+
public function getChoices()
29+
{
30+
return ['m' => 'Male', 'f' => 'Female'];
31+
}
32+
}
33+
```
34+
35+
Define an enum service for it.
36+
37+
``` yaml
38+
services:
39+
enum.member.gender:
40+
class: 'App\Enum\GenderEnum'
41+
public: false
42+
tags: ['enum']
43+
```
44+
45+
46+
The class as name way
47+
-----
48+
49+
Create a new class, use `EnumWithClassAsNameTrait` trait and implement `getChoices` methods.
50+
51+
```php
52+
<?php
53+
54+
namespace App\Enum;
55+
56+
use Yokai\EnumBundle\Enum\EnumInterface;
57+
use Yokai\EnumBundle\Enum\EnumWithClassAsNameTrait;
58+
59+
class GenderEnum implements EnumInterface
60+
{
61+
use EnumWithClassAsNameTrait;
62+
63+
public function getChoices()
64+
{
65+
return ['m' => 'Male', 'f' => 'Female'];
66+
}
67+
}
68+
```
69+
70+
Define an enum service for it.
71+
72+
``` yaml
73+
services:
74+
enum.member.gender:
75+
class: 'App\Enum\GenderEnum'
76+
public: false
77+
tags: ['enum']
78+
```
79+
80+
81+
The configurable way
82+
-----
83+
84+
No need for a class, just use the `ConfigurableEnum` class and define a new enum service.
85+
86+
``` yaml
87+
services:
88+
enum.member.gender:
89+
class: 'Yokai\EnumBundle\Enum\ConfigurableEnum'
90+
public: false
91+
tags: ['enum']
92+
arguments:
93+
- "gender"
94+
- m: 'Male'
95+
f: 'Female'
96+
```
97+

0 commit comments

Comments
 (0)