|
1 | 1 | OptionsResolver Component
|
2 | 2 | =========================
|
3 | 3 |
|
4 |
| -OptionsResolver helps at configuring objects with option arrays. |
5 |
| - |
6 |
| -It supports default values on different levels of your class hierarchy, |
7 |
| -option constraints (required vs. optional, allowed values) and lazy options |
8 |
| -whose default value depends on the value of another option. |
9 |
| - |
10 |
| -The following example demonstrates a Person class with two required options |
11 |
| -"firstName" and "lastName" and two optional options "age" and "gender", where |
12 |
| -the default value of "gender" is derived from the passed first name, if |
13 |
| -possible, and may only be one of "male" and "female". |
14 |
| - |
15 |
| -```php |
16 |
| -use Symfony\Component\OptionsResolver\OptionsResolver; |
17 |
| -use Symfony\Component\OptionsResolver\OptionsResolverInterface; |
18 |
| -use Symfony\Component\OptionsResolver\Options; |
19 |
| - |
20 |
| -class Person |
21 |
| -{ |
22 |
| - protected $options; |
23 |
| - |
24 |
| - public function __construct(array $options = array()) |
25 |
| - { |
26 |
| - $resolver = new OptionsResolver(); |
27 |
| - $this->setDefaultOptions($resolver); |
28 |
| - |
29 |
| - $this->options = $resolver->resolve($options); |
30 |
| - } |
31 |
| - |
32 |
| - protected function setDefaultOptions(OptionsResolverInterface $resolver) |
33 |
| - { |
34 |
| - $resolver->setRequired(array( |
35 |
| - 'firstName', |
36 |
| - 'lastName', |
37 |
| - )); |
38 |
| - |
39 |
| - $resolver->setDefaults(array( |
40 |
| - 'age' => null, |
41 |
| - 'gender' => function (Options $options) { |
42 |
| - if (self::isKnownMaleName($options['firstName'])) { |
43 |
| - return 'male'; |
44 |
| - } |
45 |
| - |
46 |
| - return 'female'; |
47 |
| - }, |
48 |
| - )); |
49 |
| - |
50 |
| - $resolver->setAllowedValues(array( |
51 |
| - 'gender' => array('male', 'female'), |
52 |
| - )); |
53 |
| - } |
54 |
| -} |
55 |
| -``` |
56 |
| - |
57 |
| -We can now easily instantiate a Person object: |
58 |
| - |
59 |
| -```php |
60 |
| -// 'gender' is implicitly set to 'female' |
61 |
| -$person = new Person(array( |
62 |
| - 'firstName' => 'Jane', |
63 |
| - 'lastName' => 'Doe', |
64 |
| -)); |
65 |
| -``` |
66 |
| - |
67 |
| -We can also override the default values of the optional options: |
68 |
| - |
69 |
| -```php |
70 |
| -$person = new Person(array( |
71 |
| - 'firstName' => 'Abdullah', |
72 |
| - 'lastName' => 'Mogashi', |
73 |
| - 'gender' => 'male', |
74 |
| - 'age' => 30, |
75 |
| -)); |
76 |
| -``` |
77 |
| - |
78 |
| -Options can be added or changed in subclasses by overriding the `setDefaultOptions` |
79 |
| -method: |
80 |
| - |
81 |
| -```php |
82 |
| -use Symfony\Component\OptionsResolver\OptionsResolver; |
83 |
| -use Symfony\Component\OptionsResolver\Options; |
84 |
| - |
85 |
| -class Employee extends Person |
86 |
| -{ |
87 |
| - protected function setDefaultOptions(OptionsResolverInterface $resolver) |
88 |
| - { |
89 |
| - parent::setDefaultOptions($resolver); |
90 |
| - |
91 |
| - $resolver->setRequired(array( |
92 |
| - 'birthDate', |
93 |
| - )); |
94 |
| - |
95 |
| - $resolver->setDefaults(array( |
96 |
| - // $previousValue contains the default value configured in the |
97 |
| - // parent class |
98 |
| - 'age' => function (Options $options, $previousValue) { |
99 |
| - return self::calculateAge($options['birthDate']); |
100 |
| - } |
101 |
| - )); |
102 |
| - } |
103 |
| -} |
104 |
| -``` |
105 |
| - |
106 |
| - |
| 4 | +The OptionsResolver component is `array_replace on steroids. It allows you to |
| 5 | +create an options system with required options, defaults, validation (type, |
| 6 | +value), normalization and more. |
107 | 7 |
|
108 | 8 | Resources
|
109 | 9 | ---------
|
110 | 10 |
|
111 |
| -You can run the unit tests with the following command: |
112 |
| - |
113 |
| - $ cd path/to/Symfony/Component/OptionsResolver/ |
114 |
| - $ composer install |
115 |
| - $ phpunit |
| 11 | + * [Documentation](https://symfony.com/doc/current/components/options_resolver.html) |
| 12 | + * [Contributing](https://symfony.com/doc/current/contributing/index.html) |
| 13 | + * [Report issues](https://github.com/symfony/symfony/issues) and |
| 14 | + [send Pull Requests](https://github.com/symfony/symfony/pulls) |
| 15 | + in the [main Symfony repository](https://github.com/symfony/symfony) |
0 commit comments