Commit fe7403d7 authored by Fabien Potencier's avatar Fabien Potencier

added support for Symfony ConstraintValidatorFactory

parent eb9da773
......@@ -12,8 +12,7 @@
namespace Silex;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\ConstraintValidatorFactory as BaseConstraintValidatorFactory;
/**
* Uses a service container to create constraint validators with dependencies.
......@@ -21,7 +20,7 @@ use Symfony\Component\Validator\ConstraintValidator;
* @author Kris Wallsmith <kris@symfony.com>
* @author Alex Kalyvitis <alex.kalyvitis@gmail.com>
*/
class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
class ConstraintValidatorFactory extends BaseConstraintValidatorFactory
{
/**
* @var \Pimple
......@@ -33,57 +32,34 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
*/
protected $serviceNames;
/**
* @var array
*/
protected $validators;
/**
* Constructor.
*
* @param \Pimple $container DI container
* @param array $serviceNames Validator service names
*/
public function __construct(\Pimple $container, array $serviceNames = array())
public function __construct(\Pimple $container, array $serviceNames = array(), $propertyAccessor = null)
{
// for BC with 2.3
if (method_exists('Symfony\Component\Validator\Constraint\BaseConstraintValidatorFactory', '__construct')) {
parent::__construct($propertyAccessor);
}
$this->container = $container;
$this->serviceNames = $serviceNames;
$this->validators = array();
}
/**
* Returns the validator for the supplied constraint.
*
* @param Constraint $constraint A constraint
*
* @return ConstraintValidator A validator for the supplied constraint
* {@inheritdoc}
*/
public function getInstance(Constraint $constraint)
{
$name = $constraint->validatedBy();
if (isset($this->validators[$name])) {
return $this->validators[$name];
}
$this->validators[$name] = $this->createValidator($name);
return $this->validators[$name];
}
/**
* Returns the validator instance.
*
* @param string $name
*
* @return ConstraintValidator
*/
private function createValidator($name)
{
if (isset($this->serviceNames[$name])) {
return $this->container[$this->serviceNames[$name]];
}
return new $name();
return parent::getInstance($constraint);
}
}
......@@ -64,6 +64,20 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase
$this->assertInstanceOf('Silex\Tests\Provider\ValidatorServiceProviderTest\Constraint\CustomValidator', $validator);
}
/**
* @depends testRegister
*/
public function testConstraintValidatorFactoryWithExpression($app)
{
if (!class_exists('Symfony\Component\Validator\Constraints\Expression')) {
$this->markTestSkipped('Expression are not supported by this version of Symfony');
}
$constraint = new Assert\Expression('true');
$validator = $app['validator.validator_factory']->getInstance($constraint);
$this->assertInstanceOf('Symfony\Component\Validator\Constraints\ExpressionValidator', $validator);
}
/**
* @depends testRegister
*/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment