Are you often tired to repeat static choices like gender or civility in your apps ?
Notice: This bundle is a fork from KnpLabs/DictionaryBundle. We are working on releasing a 3.0 version but for now the released version is 2.x. You should refere to the right branch to have a good documentation.
- Symfony >= 3.4
- PHP >= 7.1
Add the DictionaryBundle to your composer.json
:
{
"require": {
"biig/dictionary-bundle": "^3.0"
}
}
Or install it directly with composer command
composer require biig/dictionary-bundle
Register the bundle in app/AppKernel.php
$bundles = array(
// ...
new Knp\DictionaryBundle\KnpDictionaryBundle(),
);
Define dictionaries in your config.yaml file:
knp_dictionary:
dictionaries:
my_dictionary: # your dictionary name
- Foo # your dictionary content
- Bar
- Baz
You will be able to retrieve it through the dictionary registry service:
$container->get('knp_dictionary.registry')->get('my_dictionary');
Now, use them in your forms:
use Knp\DictionaryBundle\Form\Type\DictionaryType;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('civility', DictionaryType::class, [
'name' => 'my_dictionary'
])
;
}
The dictionary form type extends the symfony's choice type and its options.
You can also use the constraint for validation. The value
have to be set.
use Knp\DictionaryBundle\Validator\Constraints\Dictionary;
class User
{
/**
* @ORM\Column
* @Dictionary(name="my_dictionary", multiple=false)
*/
private $civility;
}
You can specify the indexation mode of each dictionary
knp_dictionary:
dictionaries:
my_dictionary: # your dictionary name
type: 'key_value' # your dictionary type
content: # your dictionary content
"foo": "foo_value"
"bar": "bar_value"
"baz": "baz_value"
value
(default) : Natural indexationvalue_as_key
: Keys are defined from their valuekey_value
: Define your own keyscallable
: Build a dictionary from a callable
You can create a callable dictionary:
knp_dictionary:
dictionaries:
my_callable_dictionary: # your dictionary name
type: 'callable' # your dictionary type
service: 'app.service.id' # a valid service from your application
method: 'getSomething' # the method name to execute
Callable dictionaries are loaded with a lazy strategy. It means that the callable will not be called if you do not use the dictionary.
If you want to retrieve some groups of dictionaries from the registry, then you can specify a category to your dictionary.
knp_dictionary:
dictionaries:
my_dictionary: # your dictionary name
type: 'key_value' # your dictionary type
category: 'product.toy' # your dictionary category
content: # your dictionary content
foo: foo_value
bar: bar_value
baz: baz_value
Get a registry for this category later:
// Retrieve all dictionaries of a special category
$dictionaries = $registry->filterByCategory('product.toy')->all();
For now, this bundle is only able to resolve your class constants:
my_dictionary:
- MyClass::MY_CONSTANT
- Foo
- Bar
You want to add other kinds of transformations for your dictionary values ? Feel free to create your own transformer !
Create your class that implements TransformerInterface.
Load your transformer and tag it as knp_dictionary.value_transformer
.
services:
my_bundle.my_namespace.my_transformer:
class: %my_transformer_class%
tags:
- { name: knp_dictionary.value_transformer }
You can also use your dictionary in your Twig templates via calling dictionary
function (or filter)
{% for example in dictionary('examples') %}
{{ example }}
{% endfor %}
But you can also access directly to a value by using the same function (or filter)
{{ 'my_key'|dictionary('dictionary_name') }}
The KnpDictionaryBundle comes with a faker provider that can be used to provide a random entry from a dictionary.
To register the provider in nelmio/alice, you can follow the official documentation
or ...
if you use the awesome knplabs/rad-fixtures-load library, the dictionary provider will be automaticaly loaded for you :)
App\Entity\User:
john_doe:
firstname: John
latnale: Doe
city: <dictionary('cities')>
You can use the following command to show your app dictionaries easily:
php bin/console knp:dictionary:dump
If you want to display only one dictionary, you can set it name in argument
php bin/console knp:dictionary:dump my_dictionary
Your dictionary implementation must implements the interface Dictionary. In Symfony >= 3.3, your class will be automatically register as dictionary service.
You must create a dictionary factory that will be responsible to instanciate your dictionary.
services:
# Syntax Symfony >= 3.3
App\Dictionary\Factory\MyCustomFactory:
tags:
{ name: 'knp_dictionary.factory' }