我遇到了一个奇怪的问题,感觉自己漏了什么。
我正在使用Symfony 2.7,并且正在开发一个用户密码更新功能。
我有一个用户实体(扩展了FosUserBundle用户实体),具有多个属性。其中之一是plainPassword(当然不会被持久化到数据库中)。
User.php
...
/**
* @ORM\Table(name="prefix_users")
* @ORM\Entity(repositoryClass="UserRepository")
*
* @UniqueEntity(fields={"email"}, message="unique", groups={"registration"})
* @UniqueEntity("username", message="unique", groups={"registration"})
*
* @ExclusionPolicy("all")
*/
class User extends BaseUser
{
...
/* @var string
*
* @Assert\NotBlank(message="blank",groups={"accountUpdate", "passwordUpdate"})
* @Assert\Length(min=8, minMessage="short", max=4096, maxMessage="long")
*/
protected $plainPassword;
正如您所见,我正在使用注释来验证我的属性。我还在使用验证组来确保只有正确的属性被验证。
我创建了一个表单
UserUpdatePasswordType.php
class UserUpdatePasswordType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('plainPassword', 'repeated', array(
'type' => 'password',
'invalid_message' => 'password_mismatch',
));
}
/**
* @param OptionsResolverInterface $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'My\Bundle\UserBundle\Entity\User',
'csrf_protection' => false,
'intention' => 'resetting',
/**
* Need to add method to prevent this form from bein marked as invalid.
* @see http://sroze.io/2013/10/30/symfony2-form-patch-requests-and-handlerequest-form-never-valid/
*/
'method' => 'PATCH'
));
}
我正在使用FOSRestBundle构建RESTful API,如果表单验证失败,我想提供一个漂亮且清晰的输出。
据我所知,有两种方式可以验证表单:
- $formErrors = $this->get('validator')->validate($user, null, ['passwordUpdate']);
- $form->isValid() 并使用$form->getErrors()获取错误
现在出现了奇怪的情况,上述两种方法给出不同的验证错误。
请求参数
user_update_password[plainPassword][first]:sffsdfdsfds
user_update_password[plainPassword][second]:fdsfdsfsd
从$formErrors获取的响应为 $this->get('validator')->validate($user, null, ['passwordUpdate']); 响应不正确,因为 plainPassword 不为空。
{
"property_path": "plainPassword",
"message": "blank"
}
响应表单$form->isValid()看起来更好
"form": {
"children": {
"plainPassword": {
"children": {
"first": {
"errors": [
"password_mismatch"
]
},
"second": {}
}
}
}
},
"errors": []
我唯一能看出来的区别在于我没有在$form->isValid()中提供验证组名称。
为什么我会得到不同的结果,我应该怎么做才能解决问题?我可以在$form->isValid()中提供一个验证组名称吗?还是应该修复$validator->validate代码中的问题?
我很想看看其他基于Symfony2的API是如何管理这个问题的...