我设置了一个非常基本的表单来注册用户(用户名+密码)。我想在我的控制器中得到验证错误。
我找到了两种方法:
// In my controller:
$user = new User();
$form = $this->createForm(new UserType, $user);
$request = $this->get('request');
if($request->getMethod() == 'POST') {
$form->bind($request);
if($form->isValid()) {
// save user in DB
} else {
// First way
$errors = $this->get('validator')->validate($user);
// OR
$errors = $form->getErrors();
}
}
如果我在表单中输入的用户名太短,则两种方法都有效(在此字段上存在约束MinLength)。但是,如果我输入两个不同的密码,表单无效且$ form-> getErrors()或$ this-> get('validator') - > validate($ user)中没有消息错误。如何收到此错误消息?
以下是我构建表单的方式
$builder->add('username', 'text', array(
'attr' => array(
'placeholder' => 'Choose an username'
),
'label' => 'Username *',
'error_bubbling' => true,
));
$builder->add('password', 'repeated', array(
'type' => 'password',
'invalid_message' => 'The password fields must match.',
'required' => true,
'first_options' => array(
'label' => 'Password',
'attr' => array('placeholder' => 'Enter password')
),
'second_options' => array(
'label' => 'Repeat Password',
'attr' => array('placeholder' => 'Retype password')
),
));
答案 0 :(得分:3)
为什么要在控制器中收到此消息?
无论如何,您必须为'password'
字段类型调用getErrors()。
这应该会给你'The password fields must match.'
错误。
$passwordErrors = $form->get('password')->getErrors();
foreach ($passwordErrors as $key => $error) {
$message .= $error->getMessageTemplate(). '<br/>';
}
error_bubbling
选项用于将给定字段的任何错误传递给父字段或表单。在您的示例中,error_bubbling
的{{1}}设置为true,因此您可以通过在父元素(此处为$ form)上调用getErrors()来获取用户名字段验证错误消息。除非您为此特定字段将username
选项设置为true,否则密码重复字段不是这种情况。
答案 1 :(得分:1)
在我的情况下,这是经过多次尝试后的最终解决方案......
FIRST:设置为false error_bubbling
(或不设置,因为false是默认值)。
SECOND:使用以下代码获取field
=&gt; error_message
数组。
$errors = array();
foreach ($form->all() as $child) {
$fieldName = $child->getName();
$fieldErrors = $form->get($child->getName())->getErrors(true);
foreach ($fieldErrors as $fieldError){
$errors[$fieldName] = $fieldError->getMessage();
}
}
此代码适用于Symfony 3.4 / 4.1