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

时间:2015-07-27 23:54:07

标签: php forms symfony data-transfer-objects

我遇到了理解如何在 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,但我希望能有更优雅的方式。

我错了吗?

1 个答案:

答案 0 :(得分:2)

根据documents,你不能。

  

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

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