[Validator] add Validation::createCallable()

This commit is contained in:
Jan Vernieuwe 2019-05-13 09:29:58 +02:00 committed by Nicolas Grekas
parent 1cfadb41dc
commit 2e4f2ac322
3 changed files with 94 additions and 0 deletions

View File

@ -0,0 +1,40 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Validator\Exception;
use Symfony\Component\Validator\ConstraintViolationListInterface;
/**
* @author Jan Vernieuwe <jan.vernieuwe@phpro.be>
*/
class ValidationFailedException extends RuntimeException
{
private $violations;
private $value;
public function __construct($value, ConstraintViolationListInterface $violations)
{
$this->violations = $violations;
$this->value = $value;
parent::__construct($violations);
}
public function getValue()
{
return $this->value;
}
public function getViolations(): ConstraintViolationListInterface
{
return $this->violations;
}
}

View File

@ -0,0 +1,36 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Validator\Tests\Validator;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Exception\ValidationFailedException;
use Symfony\Component\Validator\Validation;
/**
* @author Jan Vernieuwe <jan.vernieuwe@phpro.be>
*/
class ValidationTest extends TestCase
{
public function testCreateCallableValid()
{
$validator = Validation::createCallable(new Email());
$this->assertEquals('test@example.com', $validator('test@example.com'));
}
public function testCreateCallableInvalid()
{
$validator = Validation::createCallable(new Email());
$this->expectException(ValidationFailedException::class);
$validator('test');
}
}

View File

@ -11,6 +11,7 @@
namespace Symfony\Component\Validator;
use Symfony\Component\Validator\Exception\ValidationFailedException;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/**
@ -20,6 +21,23 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
*/
final class Validation
{
/**
* Creates a callable chain of constraints.
*/
public static function createCallable(Constraint ...$constraints): callable
{
$validator = self::createValidator();
return static function ($value) use ($constraints, $validator) {
$violations = $validator->validate($value, $constraints);
if (0 !== $violations->count()) {
throw new ValidationFailedException($value, $violations);
}
return $value;
};
}
/**
* Creates a new validator.
*