Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

[READ-ONLY] Subtree split of the Symfony OptionsResolver Component -- clone into Symfony/Component/ (master at symfony/symfony)

Merge branch '2.4'

* 2.4:
  fixed types in phpdocs
  fixed types in phpdocs

Conflicts:
	src/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php
	src/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php
	src/Symfony/Component/Serializer/Encoder/JsonEncoder.php
	src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php
	src/Symfony/Component/Validator/Mapping/ClassMetadata.php
	src/Symfony/Component/Validator/Mapping/ElementMetadata.php
	src/Symfony/Component/Validator/Mapping/MemberMetadata.php
	src/Symfony/Component/Validator/MetadataFactoryInterface.php
latest commit 1b4a27c834
Fabien Potencier fabpot authored
Octocat-spinner-32 Exception [OptionsResolver] Fixed clear() and remove() method in Options class May 14, 2012
Octocat-spinner-32 Tests feature #8375 [OptionsResolver] Allow giving a callback as an allowed… January 07, 2014
Octocat-spinner-32 .gitignore Added missing files .gitignore July 21, 2013
Octocat-spinner-32 LICENSE update year on licenses January 07, 2014
Octocat-spinner-32 Options.php fixed types in phpdocs April 16, 2014
Octocat-spinner-32 OptionsResolver.php Merge branch '2.4' March 26, 2014
Octocat-spinner-32 OptionsResolverInterface.php fixed types in phpdocs April 16, 2014
Octocat-spinner-32 README.md updated the composer install command to reflect changes in Composer September 18, 2013
Octocat-spinner-32 composer.json updated version to 2.5 November 24, 2013
Octocat-spinner-32 phpunit.xml.dist made usage of Composer autoloader for subtree-split unit tests November 09, 2012
README.md

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
Something went wrong with that request. Please try again.