我遇到了理解如何在 Symfony 的DataTransformers中处理数据的麻烦。
我只有一个密码表单。只有一个领域。此字段属于User实体,该实体必须具有.yml
文件中定义的约束。
Software\Bundle\Entity\User:
password:
- NotBlank: ~
- Length:
min: 6
max: 155
验证工作正常,应该如此。密码必须从字段自动编码时出现问题。所以,
$builder->add('password', 'password', [
'label' => 'word.password'
]);
$builder->get('password')
->addModelTransformer(new EncodePasswordTransformer());
变压器本身:
class EncodePasswordTransformer implements DataTransformerInterface
{
public function transform($value)
{
return $value;
}
public function reverseTransform($value)
{
// encode password
return PasswordHash::createHash($value);
}
}
所以这就是发生的事情:
表单应包含6到155个字符,但$form->isValid()
始终为true,因为PasswordHash::createHash($value)
将密码编码为32个字符。我期待的是:
表单验证原始密码,如果超过6个字符,则转到$form->isValid()
true,然后在验证密码后对其进行编码。
我知道我可以在表格有效的情况下手动编码密码,而不使用DataTransformer
,但我希望能有更优雅的方式。
我错了吗?
答案 0 :(得分:2)
根据documents,你不能。
Symfony的表单库在内部使用验证器服务在提交值后验证底层对象。
所以你实际上并没有验证表单,但是下面的对象没有普通密码的“概念”。
一个不那么优雅的解决方案是在用户上包含一个普通的密码字段,并且不能持久。但是,您可能无法验证现有的用户对象(例如:在更新表单中),因为它们的普通密码字段将为null
。为了解决这个问题,您可以创建一个自定义验证程序,仅当用户不是新时才会检查$plainPassword
字段的有效性。您可以使用学说UnitOfWork
或检查用户的id
是否为null
来检查。
我建议你也看一下FOSUserBundle
它对普通密码字段有一个类似的方法,而可能有你正在寻找的东西。