sup*_*r.t 1 php symfony symfony-validator
我需要将类型的对象转换ConstraintViolationListInterface为单个异常以进行进一步的记录,其中消息是验证失败时列表中每个约束违例的消息的串联。
显然,我无法使用验证在每个捆绑软件中重复一个foreach循环来实现这一点,因此我在考虑再创建一个捆绑软件,以提供一个接受ConstraintViolationListInterface并返回单个异常的简单服务。Symfony中对此有标准解决方案吗?似乎我需要编写此服务很奇怪,这个问题对我来说似乎很常见。
我也惊讶于symfony对此无济于事,这就是为什么我创建了自定义异常的原因:
class ValidationException extends \Exception
{
private $violations;
public function __construct(array $violations)
{
$this->violations = $violations;
parent::__construct('Validation failed.');
}
public function getMessages()
{
$messages = [];
foreach ($this->violations as $paramName => $violationList) {
foreach ($violationList as $violation) {
$messages[$paramName][] = $violation->getMessage();
}
}
return $messages;
}
public function getJoinedMessages()
{
$messages = [];
foreach ($this->violations as $paramName => $violationList) {
foreach ($violationList as $violation) {
$messages[$paramName][] = $violation->getMessage();
}
$messages[$paramName] = implode(' ', $messages[$paramName]);
}
return $messages;
}
}
Run Code Online (Sandbox Code Playgroud)
这里提供所有代码。
我以另一种方式使用此异常:
try {
$errors = $validator->validate(...);
if (0 !== count($errors)) {
throw new ValidationException($errors);
}
} catch (ValidationException $e) {
// Here you can obtain your validation errors.
var_dump($e->getMessages());
}
Run Code Online (Sandbox Code Playgroud)