[Validator] Allow objects implementing __toString() to be used as violation messages
[Validator] updated changelog [Validator] updated typehint for ConstraintViolationInterface::getMessage() [Validator] fixed spacing issue inadvertantly added in previous commit [Validator] fixed coding standard issues [Validator] Address feedback [Validator] Fix coding standard violation [Validator] update tests [Validator] Address feedback, Round 2 [Validator] Document ConstraintViolationBuilder::__construct() parameter [Validator] Update changelog [Validator] Adjust parameter documentation order
This commit is contained in:
parent
e0ccbf667a
commit
79f4dcd2dc
@ -20,6 +20,7 @@ CHANGELOG
|
|||||||
`maxPropertyPath` options
|
`maxPropertyPath` options
|
||||||
* added a new `notInRangeMessage` option to the `Range` constraint that will
|
* added a new `notInRangeMessage` option to the `Range` constraint that will
|
||||||
be used in the violation builder when both `min` and `max` are not null
|
be used in the violation builder when both `min` and `max` are not null
|
||||||
|
* added ability to use stringable objects as violation messages
|
||||||
|
|
||||||
4.3.0
|
4.3.0
|
||||||
-----
|
-----
|
||||||
|
@ -32,7 +32,7 @@ class ConstraintViolation implements ConstraintViolationInterface
|
|||||||
/**
|
/**
|
||||||
* Creates a new constraint violation.
|
* Creates a new constraint violation.
|
||||||
*
|
*
|
||||||
* @param string $message The violation message
|
* @param string $message The violation message as a string or a stringable object
|
||||||
* @param string $messageTemplate The raw violation message
|
* @param string $messageTemplate The raw violation message
|
||||||
* @param array $parameters The parameters to substitute in the
|
* @param array $parameters The parameters to substitute in the
|
||||||
* raw violation message
|
* raw violation message
|
||||||
@ -47,7 +47,7 @@ class ConstraintViolation implements ConstraintViolationInterface
|
|||||||
* @param string|null $code The error code of the violation
|
* @param string|null $code The error code of the violation
|
||||||
* @param mixed $cause The cause of the violation
|
* @param mixed $cause The cause of the violation
|
||||||
*/
|
*/
|
||||||
public function __construct(?string $message, ?string $messageTemplate, array $parameters, $root, ?string $propertyPath, $invalidValue, int $plural = null, $code = null, Constraint $constraint = null, $cause = null)
|
public function __construct($message, ?string $messageTemplate, array $parameters, $root, ?string $propertyPath, $invalidValue, int $plural = null, $code = null, Constraint $constraint = null, $cause = null)
|
||||||
{
|
{
|
||||||
if (null === $message) {
|
if (null === $message) {
|
||||||
@trigger_error(sprintf('Passing a null message when instantiating a "%s" is deprecated since Symfony 4.4.', __CLASS__), E_USER_DEPRECATED);
|
@trigger_error(sprintf('Passing a null message when instantiating a "%s" is deprecated since Symfony 4.4.', __CLASS__), E_USER_DEPRECATED);
|
||||||
@ -58,6 +58,10 @@ class ConstraintViolation implements ConstraintViolationInterface
|
|||||||
@trigger_error(sprintf('Not using a string as the error code in %s() is deprecated since Symfony 4.4. A type-hint will be added in 5.0.', __METHOD__), E_USER_DEPRECATED);
|
@trigger_error(sprintf('Not using a string as the error code in %s() is deprecated since Symfony 4.4. A type-hint will be added in 5.0.', __METHOD__), E_USER_DEPRECATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!\is_string($message) && !(\is_object($message) && method_exists($message, '__toString'))) {
|
||||||
|
throw new \TypeError('Constraint violation message should be a string or an object which implements the __toString() method.');
|
||||||
|
}
|
||||||
|
|
||||||
$this->message = $message;
|
$this->message = $message;
|
||||||
$this->messageTemplate = $messageTemplate;
|
$this->messageTemplate = $messageTemplate;
|
||||||
$this->parameters = $parameters;
|
$this->parameters = $parameters;
|
||||||
|
@ -36,7 +36,7 @@ interface ConstraintViolationInterface
|
|||||||
/**
|
/**
|
||||||
* Returns the violation message.
|
* Returns the violation message.
|
||||||
*
|
*
|
||||||
* @return string The violation message
|
* @return string The violation message as a string or a stringable object
|
||||||
*/
|
*/
|
||||||
public function getMessage();
|
public function getMessage();
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ interface ExecutionContextInterface
|
|||||||
/**
|
/**
|
||||||
* Adds a violation at the current node of the validation graph.
|
* Adds a violation at the current node of the validation graph.
|
||||||
*
|
*
|
||||||
* @param string $message The error message
|
* @param string $message The error message as a string or a stringable object
|
||||||
* @param array $params The parameters substituted in the error message
|
* @param array $params The parameters substituted in the error message
|
||||||
*/
|
*/
|
||||||
public function addViolation($message, array $params = []);
|
public function addViolation($message, array $params = []);
|
||||||
@ -81,7 +81,7 @@ interface ExecutionContextInterface
|
|||||||
* ->setTranslationDomain('number_validation')
|
* ->setTranslationDomain('number_validation')
|
||||||
* ->addViolation();
|
* ->addViolation();
|
||||||
*
|
*
|
||||||
* @param string $message The error message
|
* @param string $message The error message as a string or a stringable object
|
||||||
* @param array $parameters The parameters substituted in the error message
|
* @param array $parameters The parameters substituted in the error message
|
||||||
*
|
*
|
||||||
* @return ConstraintViolationBuilderInterface The violation builder
|
* @return ConstraintViolationBuilderInterface The violation builder
|
||||||
|
@ -13,6 +13,8 @@ namespace Symfony\Component\Validator\Tests;
|
|||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Validator\ConstraintViolation;
|
use Symfony\Component\Validator\ConstraintViolation;
|
||||||
|
use Symfony\Component\Validator\Tests\Fixtures\CustomArrayObject;
|
||||||
|
use Symfony\Component\Validator\Tests\Fixtures\ToString;
|
||||||
|
|
||||||
class ConstraintViolationTest extends TestCase
|
class ConstraintViolationTest extends TestCase
|
||||||
{
|
{
|
||||||
@ -109,6 +111,52 @@ EOF;
|
|||||||
$this->assertSame($expected, (string) $violation);
|
$this->assertSame($expected, (string) $violation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMessageCanBeStringableObject()
|
||||||
|
{
|
||||||
|
$message = new ToString();
|
||||||
|
$violation = new ConstraintViolation(
|
||||||
|
$message,
|
||||||
|
(string) $message,
|
||||||
|
[],
|
||||||
|
'Root',
|
||||||
|
'property.path',
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
$expected = <<<'EOF'
|
||||||
|
Root.property.path:
|
||||||
|
toString
|
||||||
|
EOF;
|
||||||
|
$this->assertSame($expected, (string) $violation);
|
||||||
|
$this->assertSame($message, $violation->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testMessageCannotBeArray()
|
||||||
|
{
|
||||||
|
$this->expectException(\TypeError::class);
|
||||||
|
$violation = new ConstraintViolation(
|
||||||
|
['cannot be an array'],
|
||||||
|
'',
|
||||||
|
[],
|
||||||
|
'Root',
|
||||||
|
'property.path',
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testMessageObjectMustBeStringable()
|
||||||
|
{
|
||||||
|
$this->expectException(\TypeError::class);
|
||||||
|
$violation = new ConstraintViolation(
|
||||||
|
new CustomArrayObject(),
|
||||||
|
'',
|
||||||
|
[],
|
||||||
|
'Root',
|
||||||
|
'property.path',
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @group legacy
|
* @group legacy
|
||||||
* @expectedDeprecation Not using a string as the error code in Symfony\Component\Validator\ConstraintViolation::__construct() is deprecated since Symfony 4.4. A type-hint will be added in 5.0.
|
* @expectedDeprecation Not using a string as the error code in Symfony\Component\Validator\ConstraintViolation::__construct() is deprecated since Symfony 4.4. A type-hint will be added in 5.0.
|
||||||
|
@ -45,9 +45,10 @@ class ConstraintViolationBuilder implements ConstraintViolationBuilderInterface
|
|||||||
private $cause;
|
private $cause;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param string $message The error message as a string or a stringable object
|
||||||
* @param TranslatorInterface $translator
|
* @param TranslatorInterface $translator
|
||||||
*/
|
*/
|
||||||
public function __construct(ConstraintViolationList $violations, Constraint $constraint, ?string $message, array $parameters, $root, string $propertyPath, $invalidValue, $translator, string $translationDomain = null)
|
public function __construct(ConstraintViolationList $violations, Constraint $constraint, $message, array $parameters, $root, string $propertyPath, $invalidValue, $translator, string $translationDomain = null)
|
||||||
{
|
{
|
||||||
if (null === $message) {
|
if (null === $message) {
|
||||||
@trigger_error(sprintf('Passing a null message when instantiating a "%s" is deprecated since Symfony 4.4.', __CLASS__), E_USER_DEPRECATED);
|
@trigger_error(sprintf('Passing a null message when instantiating a "%s" is deprecated since Symfony 4.4.', __CLASS__), E_USER_DEPRECATED);
|
||||||
|
Reference in New Issue
Block a user