我正在验证一些值:
$collectionConstraint = new Collection(array(
'email' => array(
new NotBlank(),
new Email(),
),
'password' => array(
new NotBlank(),
new MinLength(array('limit' => 6)),
new MaxLength(array('limit' => 25)),
),
));
$data = array('email' => $this->getRequest()->get('email'), 'password' => $this->getRequest()->get('password'));
$errors = $this->get('validator')->validateValue($data, $collectionConstraint);
但由于某种原因,字段(propertyPath)存储有方括号 - 我想理解为什么Sf会这样做。我必须手动删除所有看似荒谬的括号,所以我觉得我在某处缺少某些功能。
转储$错误:
Symfony\Component\Validator\ConstraintViolationList Object
(
[violations:protected] => Array
(
[0] => Symfony\Component\Validator\ConstraintViolation Object
(
[messageTemplate:protected] => This value should not be blank
[messageParameters:protected] => Array
(
)
[root:protected] => Array
(
[email] =>
[password] =>
)
[propertyPath:protected] => [email]
[invalidValue:protected] =>
)
[1] => Symfony\Component\Validator\ConstraintViolation Object
(
[messageTemplate:protected] => This value should not be blank
[messageParameters:protected] => Array
(
)
[root:protected] => Array
(
[email] =>
[password] =>
)
[propertyPath:protected] => [password]
[invalidValue:protected] =>
)
)
)
即使是toString函数也没用。
"[email]: This value should not be blank","[password]: This value should not be blank"
答案 0 :(得分:5)
属性路径可以映射到属性或索引。考虑一个实现OptionBag
的课程\ArrayAccess
和一个方法getSize()
。
size
引用$optionBag->getSize()
[size]
引用$optionBag['size']
在您的情况下,您验证一个数组。由于数组元素也可以通过索引访问,因此违规中生成的属性路径包含方括号。
<强>更新强>
您无需手动移除方括号。您可以使用Symfony的PropertyAccess组件将错误映射到与数据结构相同的数组,例如:
$collectionConstraint = new Collection(array(
'email' => array(
new NotBlank(),
new Email(),
),
'password' => array(
new NotBlank(),
new MinLength(array('limit' => 6)),
new MaxLength(array('limit' => 25)),
),
));
$data = array(
'email' => $this->getRequest()->get('email'),
'password' => $this->getRequest()->get('password')
);
$violations = $this->get('validator')->validateValue($data, $collectionConstraint);
$errors = array();
$accessor = $this->get('property_accessor');
foreach ($violations as $violation) {
$accessor->setValue($errors, $violation->getPropertyPath(), $violation->getMessage());
}
=> array(
'email' => 'This value should not be blank.',
'password' => 'This value should have 6 characters or more.',
)
这也适用于多维数据阵列。那里的属性路径类似于[author][name]
。 PropertyAccessor会将错误消息插入$errors
数组中的相同位置,即$errors['author']['name'] = 'Message'
。
答案 1 :(得分:0)
PropertyAccessor's
setValue
并没有真正的帮助,因为它不能处理单个字段的多个违例。例如,字段可能短于约束长度,并且还包含非法字符。为此,我们将有两个错误消息。
我必须创建自己的代码:
$messages = [];
foreach ($violations as $violation) {
$field = substr($violation->getPropertyPath(), 1, -1);
$messages[] = [$field => $violation->getMessage()];
}
$output = [
'name' => array_unique(array_column($messages, 'name')),
'email' => array_unique(array_column($messages, 'email')),
];
return $output;
我们从属性路径中手动删除[]
个字符,并创建一个
字段和相应消息的数组的数组。稍后我们将
数组以按字段对消息进行分组。
$session = $request->getSession();
$session->getFlashBag()->setAll($messages);
在控制器中,我们将消息添加到Flash包中。