Commit 423138aa authored by alexkappa's avatar alexkappa

- Type hint in Silex\ConstraintValidatorFactory constructor for container

- Modifed Silex\Provider\ValidatorServiceProvider to accept an optional
  'validator.validator_service_ids' parameter wich allows users to register
  custom validators.
- Added test to verify that if users registered ValidatorServiceProvider
  using optional 'validator.validator_service_ids' parameter then the new
  Silex\ConstraintValidatorFactory will be used instead of the one provided
  in  Symfony.
parent eaf0af2a
...@@ -11,27 +11,13 @@ ...@@ -11,27 +11,13 @@
namespace Silex; namespace Silex;
use Silex\Application;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidatorFactoryInterface; use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
use Symfony\Component\Validator\ConstraintValidator; use Symfony\Component\Validator\ConstraintValidator;
/** /**
* Uses a service container to create constraint validators. * Uses a service container to create constraint validators with dependencies.
*
* A constraint validator should be tagged as "validator.constraint_validator"
* in the service container and include an "alias" attribute:
*
* <service id="some_doctrine_validator">
* <argument type="service" id="doctrine.orm.some_entity_manager" />
* <tag name="validator.constraint_validator" alias="some_alias" />
* </service>
*
* A constraint may then return this alias in its validatedBy() method:
*
* public function validatedBy()
* {
* return 'some_alias';
* }
* *
* @author Kris Wallsmith <kris@symfony.com> * @author Kris Wallsmith <kris@symfony.com>
*/ */
...@@ -43,9 +29,10 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface ...@@ -43,9 +29,10 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
/** /**
* Constructor. * Constructor.
* *
* @param array $validators An array of validators * @param Silex\Application $container A DI container
* @param array $validators An array of validators
*/ */
public function __construct($container, array $validators = array()) public function __construct(Application $container, array $validators = array())
{ {
$this->container = $container; $this->container = $container;
$this->validators = $validators; $this->validators = $validators;
...@@ -70,4 +57,4 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface ...@@ -70,4 +57,4 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
return $this->validators[$name]; return $this->validators[$name];
} }
} }
\ No newline at end of file
...@@ -13,12 +13,13 @@ namespace Silex\Provider; ...@@ -13,12 +13,13 @@ namespace Silex\Provider;
use Silex\Application; use Silex\Application;
use Silex\ServiceProviderInterface; use Silex\ServiceProviderInterface;
use Silex\ConstraintValidatorFactory;
use Symfony\Component\Validator\Validator; use Symfony\Component\Validator\Validator;
use Symfony\Component\Validator\DefaultTranslator; use Symfony\Component\Validator\DefaultTranslator;
use Symfony\Component\Validator\Mapping\ClassMetadataFactory; use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader; use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
use Symfony\Component\Validator\ConstraintValidatorFactory; use Symfony\Component\Validator\ConstraintValidatorFactory as BaseConstraintValidatorFactory;
/** /**
* Symfony Validator component Provider. * Symfony Validator component Provider.
...@@ -29,7 +30,7 @@ class ValidatorServiceProvider implements ServiceProviderInterface ...@@ -29,7 +30,7 @@ class ValidatorServiceProvider implements ServiceProviderInterface
{ {
public function register(Application $app) public function register(Application $app)
{ {
$app['validator'] = $app->share(function ($app) { $app['validator'] = $app->share(function($app) {
$r = new \ReflectionClass('Symfony\Component\Validator\Validator'); $r = new \ReflectionClass('Symfony\Component\Validator\Validator');
if (isset($app['translator'])) { if (isset($app['translator'])) {
...@@ -58,8 +59,16 @@ class ValidatorServiceProvider implements ServiceProviderInterface ...@@ -58,8 +59,16 @@ class ValidatorServiceProvider implements ServiceProviderInterface
return new ClassMetadataFactory(new StaticMethodLoader()); return new ClassMetadataFactory(new StaticMethodLoader());
}); });
$app['validator.validator_factory'] = $app->share(function () { $app['validator.validator_factory'] = $app->share(function() use ($app) {
return new ConstraintValidatorFactory(); if (isset($app['validator.validator_service_ids'])) {
$validators = array();
foreach ($app['validator.validator_service_ids'] as $service) {
$validators[] = $app[$service];
}
return new ConstraintValidatorFactory($app, $validators);
} else {
return new BaseConstraintValidatorFactory();
}
}); });
} }
......
...@@ -39,6 +39,40 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -39,6 +39,40 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase
return $app; return $app;
} }
public function testRegisterWithCustomValidators()
{
$app = new Application();
// Dummy ConstraintValidators
$app['validator.x'] = 'x';
$app['validator.y'] = 'y';
$app->register(new ValidatorServiceProvider(), array(
'validator.validator_service_ids' => array(
'validator.x',
'validator.y'
)
));
return $app;
}
/**
* @depends testRegisterWithCustomValidators
*/
public function testSilexConstraintValidatorFactory($app)
{
$this->assertInstanceOf('Silex\ConstraintValidatorFactory', $app['validator.validator_factory']);
}
/**
* @depends testRegister
*/
public function testSymfonyConstraintValidatorFactory($app)
{
$this->assertInstanceOf('Symfony\Component\Validator\ConstraintValidatorFactory', $app['validator.validator_factory']);
}
/** /**
* @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