0

我在理解Symfony的DataTransformers中如何准确处理数据时遇到了麻烦。

我只有一个密码表格。只有一个领域。该字段属于必须在.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,但我希望有一种更优雅的方式。

我错了吗?

4

1 回答 1

2

根据文件,你不能。

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

因此,您实际上并不是在验证表单,而是在其下面的对象没有纯密码的“概念”。
一个不太优雅的解决方案是在您的用户上包含一个纯密码字段而不是持久化它。但是,您可能无法验证现有的用户对象(例如:在更新表单中),因为它们的纯密码字段将是null. 为了解决这个问题,您可以创建一个自定义验证器,$plainPassword仅当用户不是用户时才检查字段的有效性。您可以通过使用学说UnitOfWork或通过检查id用户是否为null.
我建议你也看看FOSUserBundle它有(或有)与普通密码字段类似的方法,并且可能有你要找的东西。

于 2015-07-28T06:18:01.703 回答