This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
symfony/src/Symfony/Component/OptionsResolver
Fabien Potencier 88cef41560 Merge branch '2.2' into 2.3
* 2.2:
  Fix some annotates
  [FrameworkBundle] made sure that the debug event dispatcher is used everywhere
  [HttpKernel] remove unneeded strtoupper
  updated the composer install command to reflect changes in Composer

Conflicts:
	src/Symfony/Component/Console/Application.php
	src/Symfony/Component/Console/Command/Command.php
	src/Symfony/Component/Console/Input/InputDefinition.php
	src/Symfony/Component/CssSelector/Node/CombinedSelectorNode.php
	src/Symfony/Component/Form/Form.php
	src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php
	src/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php
	src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php
	src/Symfony/Component/Locale/Locale.php
	src/Symfony/Component/Locale/README.md
	src/Symfony/Component/Locale/Stub/DateFormat/FullTransformer.php
2013-09-19 11:45:20 +02:00
..
Exception [OptionsResolver] Fixed clear() and remove() method in Options class 2012-05-14 19:35:41 +02:00
Tests [CS Fix] Consistent coding-style of concatenation operator usage 2013-04-02 10:39:57 +01:00
.gitignore Added missing files .gitignore 2013-07-21 14:12:18 +02:00
composer.json updated the branch alias in composer files 2013-01-31 22:39:01 +01:00
LICENSE Merge branch '2.0' into 2.1 2013-01-04 18:00:54 +01:00
Options.php Enforce sprintf for exceptions 2013-04-11 08:50:46 +02:00
OptionsResolver.php [CS Fix] Consistent coding-style of concatenation operator usage 2013-04-02 10:39:57 +01:00
OptionsResolverInterface.php [OptionsResolver] Renamed filters to normalizers 2012-07-21 13:02:12 +02:00
phpunit.xml.dist made usage of Composer autoloader for subtree-split unit tests 2012-11-09 14:10:06 +01:00
README.md updated the composer install command to reflect changes in Composer 2013-09-18 09:27:26 +02:00

OptionsResolver Component

OptionsResolver helps at configuring objects with option arrays.

It supports default values on different levels of your class hierarchy, option constraints (required vs. optional, allowed values) and lazy options whose default value depends on the value of another option.

The following example demonstrates a Person class with two required options "firstName" and "lastName" and two optional options "age" and "gender", where the default value of "gender" is derived from the passed first name, if possible, and may only be one of "male" and "female".

use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\OptionsResolver\Options;

class Person
{
    protected $options;

    public function __construct(array $options = array())
    {
        $resolver = new OptionsResolver();
        $this->setDefaultOptions($resolver);

        $this->options = $resolver->resolve($options);
    }

    protected function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setRequired(array(
            'firstName',
            'lastName',
        ));

        $resolver->setDefaults(array(
            'age' => null,
            'gender' => function (Options $options) {
                if (self::isKnownMaleName($options['firstName'])) {
                    return 'male';
                }

                return 'female';
            },
        ));

        $resolver->setAllowedValues(array(
            'gender' => array('male', 'female'),
        ));
    }
}

We can now easily instantiate a Person object:

// 'gender' is implicitly set to 'female'
$person = new Person(array(
    'firstName' => 'Jane',
    'lastName' => 'Doe',
));

We can also override the default values of the optional options:

$person = new Person(array(
    'firstName' => 'Abdullah',
    'lastName' => 'Mogashi',
    'gender' => 'male',
    'age' => 30,
));

Options can be added or changed in subclasses by overriding the setDefaultOptions method:

use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\OptionsResolver\Options;

class Employee extends Person
{
    protected function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        parent::setDefaultOptions($resolver);

        $resolver->setRequired(array(
            'birthDate',
        ));

        $resolver->setDefaults(array(
            // $previousValue contains the default value configured in the
            // parent class
            'age' => function (Options $options, $previousValue) {
                return self::calculateAge($options['birthDate']);
            }
        ));
    }
}

Resources

You can run the unit tests with the following command:

$ cd path/to/Symfony/Component/OptionsResolver/
$ composer.phar install
$ phpunit