Commit 1bb52067 authored by Fabien Potencier's avatar Fabien Potencier

bug #1210 added support for Symfony ConstraintValidatorFactory (fabpot)

This PR was merged into the 1.3 branch.

Discussion
----------

added support for Symfony ConstraintValidatorFactory

fixes #1191

Commits
-------

3f93eb88 added missing docs
fe7403d7 added support for Symfony ConstraintValidatorFactory
eb9da773 simplified code
parents 79dec6aa 3f93eb88
...@@ -8,7 +8,8 @@ standalone. ...@@ -8,7 +8,8 @@ standalone.
Parameters Parameters
---------- ----------
none * **validator.validator_service_ids**: An array of service names representing
validators.
Services Services
-------- --------
...@@ -24,10 +25,6 @@ Services ...@@ -24,10 +25,6 @@ Services
data class, which takes a ClassMetadata argument. Then you can set data class, which takes a ClassMetadata argument. Then you can set
constraints on this ClassMetadata instance. constraints on this ClassMetadata instance.
* **validator.validator_factory**: Factory for ConstraintValidators. Defaults
to a standard ``ConstraintValidatorFactory``. Mostly used internally by the
Validator.
Registering Registering
----------- -----------
......
...@@ -12,8 +12,7 @@ ...@@ -12,8 +12,7 @@
namespace Silex; namespace Silex;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidatorFactoryInterface; use Symfony\Component\Validator\ConstraintValidatorFactory as BaseConstraintValidatorFactory;
use Symfony\Component\Validator\ConstraintValidator;
/** /**
* Uses a service container to create constraint validators with dependencies. * Uses a service container to create constraint validators with dependencies.
...@@ -21,7 +20,7 @@ use Symfony\Component\Validator\ConstraintValidator; ...@@ -21,7 +20,7 @@ use Symfony\Component\Validator\ConstraintValidator;
* @author Kris Wallsmith <kris@symfony.com> * @author Kris Wallsmith <kris@symfony.com>
* @author Alex Kalyvitis <alex.kalyvitis@gmail.com> * @author Alex Kalyvitis <alex.kalyvitis@gmail.com>
*/ */
class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface class ConstraintValidatorFactory extends BaseConstraintValidatorFactory
{ {
/** /**
* @var \Pimple * @var \Pimple
...@@ -33,57 +32,34 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface ...@@ -33,57 +32,34 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
*/ */
protected $serviceNames; protected $serviceNames;
/**
* @var array
*/
protected $validators;
/** /**
* Constructor. * Constructor.
* *
* @param \Pimple $container DI container * @param \Pimple $container DI container
* @param array $serviceNames Validator service names * @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->container = $container;
$this->serviceNames = $serviceNames; $this->serviceNames = $serviceNames;
$this->validators = array();
} }
/** /**
* Returns the validator for the supplied constraint. * {@inheritdoc}
*
* @param Constraint $constraint A constraint
*
* @return ConstraintValidator A validator for the supplied constraint
*/ */
public function getInstance(Constraint $constraint) public function getInstance(Constraint $constraint)
{ {
$name = $constraint->validatedBy(); $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])) { if (isset($this->serviceNames[$name])) {
return $this->container[$this->serviceNames[$name]]; return $this->container[$this->serviceNames[$name]];
} }
return new $name(); return parent::getInstance($constraint);
} }
} }
...@@ -575,10 +575,6 @@ class SecurityServiceProvider implements ServiceProviderInterface ...@@ -575,10 +575,6 @@ class SecurityServiceProvider implements ServiceProviderInterface
return new UserPasswordValidator($app['security.token_storage'], $app['security.encoder_factory']); return new UserPasswordValidator($app['security.token_storage'], $app['security.encoder_factory']);
}); });
if (!isset($app['validator.validator_service_ids'])) {
$app['validator.validator_service_ids'] = array();
}
$app['validator.validator_service_ids'] = array_merge($app['validator.validator_service_ids'], array('security.validator.user_password' => 'security.validator.user_password_validator')); $app['validator.validator_service_ids'] = array_merge($app['validator.validator_service_ids'], array('security.validator.user_password' => 'security.validator.user_password_validator'));
} }
} }
......
...@@ -68,14 +68,14 @@ class ValidatorServiceProvider implements ServiceProviderInterface ...@@ -68,14 +68,14 @@ class ValidatorServiceProvider implements ServiceProviderInterface
}); });
$app['validator.validator_factory'] = $app->share(function () use ($app) { $app['validator.validator_factory'] = $app->share(function () use ($app) {
$validators = isset($app['validator.validator_service_ids']) ? $app['validator.validator_service_ids'] : array(); return new ConstraintValidatorFactory($app, $app['validator.validator_service_ids']);
return new ConstraintValidatorFactory($app, $validators);
}); });
$app['validator.object_initializers'] = $app->share(function ($app) { $app['validator.object_initializers'] = $app->share(function ($app) {
return array(); return array();
}); });
$app['validator.validator_service_ids'] = array();
} }
public function boot(Application $app) public function boot(Application $app)
......
...@@ -64,6 +64,20 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -64,6 +64,20 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase
$this->assertInstanceOf('Silex\Tests\Provider\ValidatorServiceProviderTest\Constraint\CustomValidator', $validator); $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 * @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