Skip to content

Commit

Permalink
Allow giving a callback as an allowedValue to OptionsResolver
Browse files Browse the repository at this point in the history
  • Loading branch information
marekkalnik committed Jan 7, 2014
1 parent fae3e35 commit 07d1d30
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/Symfony/Component/OptionsResolver/OptionsResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,14 @@ private function validateOptionsCompleteness(array $options)
private function validateOptionValues(array $options)
{
foreach ($this->allowedValues as $option => $allowedValues) {
if (isset($options[$option]) && !in_array($options[$option], $allowedValues, true)) {
throw new InvalidOptionsException(sprintf('The option "%s" has the value "%s", but is expected to be one of "%s"', $option, $options[$option], implode('", "', $allowedValues)));
if (isset($options[$option])) {
if (is_array($allowedValues) && !in_array($options[$option], $allowedValues, true)) {
throw new InvalidOptionsException(sprintf('The option "%s" has the value "%s", but is expected to be one of "%s"', $option, $options[$option], implode('", "', $allowedValues)));
}

if (is_callable($allowedValues) && !call_user_func($allowedValues, $options[$option])) {
throw new InvalidOptionsException(sprintf('The option "%s" has the value "%s", which it is not valid', $option, $options[$option]));
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -658,6 +658,45 @@ public function testResolveSucceedsIfOptionRequiredAndValueAllowed()
$this->assertEquals($options, $this->resolver->resolve($options));
}

public function testResolveSucceedsIfValueAllowedCallbackReturnsTrue()
{
$this->resolver->setRequired(array(
'test',
));
$this->resolver->setAllowedValues(array(
'test' => function ($value) {
return true;
},
));

$options = array(
'test' => true,
);

$this->assertEquals($options, $this->resolver->resolve($options));
}

/**
* @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
*/
public function testResolveFailsIfValueAllowedCallbackReturnsFalse()
{
$this->resolver->setRequired(array(
'test',
));
$this->resolver->setAllowedValues(array(
'test' => function ($value) {
return false;
},
));

$options = array(
'test' => true,
);

$this->assertEquals($options, $this->resolver->resolve($options));
}

public function testClone()
{
$this->resolver->setDefaults(array('one' => '1'));
Expand Down

0 comments on commit 07d1d30

Please sign in to comment.