Php $form之后的Symfony数据转换器->;isValid()

Php $form之后的Symfony数据转换器->;isValid(),php,forms,symfony,data-transfer-objects,Php,Forms,Symfony,Data Transfer Objects,我在理解Symfony中如何准确处理数据时遇到了困难 我有一张密码表。只有一个领域。此字段属于用户实体,必须遵守.yml文件中定义的约束 Software\Bundle\Entity\User: password: - NotBlank: ~ - Length: min: 6 max: 155 正如所设想的那样,验证工作正常。当密码必须从字段中自动编码时,会出现问题。所以 $builder->

我在理解Symfony中如何准确处理数据时遇到了困难

我有一张密码表。只有一个领域。此字段属于用户实体,必须遵守
.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()
始终为真,因为
PasswordHash::createHash($value)
将密码编码为32个字符。我所期待的是:

表单验证原始密码,如果超过6个字符,请转到
$Form->isValid()
true,然后在验证后对密码进行编码

我知道我可以在表单有效时手动编码密码,而无需使用
DataTransformer
,但我希望有一种更优雅的方式


我错了吗?

你不能,根据《美国宪法》

Symfony的表单库在提交值后在内部使用验证程序服务验证底层对象

因此,您实际上不是在验证表单,而是验证下面的对象,它没有普通密码的“概念”。
一个不那么优雅的解决方案是在用户上包含一个简单的密码字段,并且不保留它。但是,您可能无法验证现有的用户对象(例如:在更新表单中),因为它们的普通密码字段将为
null
。为了解决这个问题,您可以创建一个自定义验证器,仅当用户不是新的时,才检查
$plainPassword
字段的有效性。您可以通过使用doctrine的
工作单元
或检查用户的
id
是否为
null

我建议您也看看
FOSUserBundle
它对普通密码字段有(或有)类似的方法,并且可能有您想要的