【问题标题】:Symfony data transformer after $form->isValid()$form->isValid() 之后的 Symfony 数据转换器
【发布时间】:2015-07-27 23:54:06
【问题描述】:

我在理解 SymfonyDataTransformers 中究竟如何处理数据时遇到了麻烦。

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

我错了吗?

【问题讨论】:

    标签: php forms symfony data-transfer-objects


    【解决方案1】:

    你不能,根据documents

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多