【问题标题】:Edit form ignores validation annotations编辑表单忽略验证注释
【发布时间】:2019-05-02 17:48:42
【问题描述】:

在一个简单的用户管理实现(Symfony 4.1.7,easyadmin 1.17.16)中,编辑表单会忽略实体验证注释,而新表单则不会。例如,如果在提交表单时编辑表单中的电子邮件字段为空,则会抛出 InvalidArgumentException 和消息 Expected argument of type "string", "NULL" given。如果从 User 实体中删除了验证注释,也会引发此异常。

新表单中的相同字段为空时返回验证消息Email address is required

用户实体属性(某些字段未显示):

/**
 * @ORM\Column(type="string", length=180, unique=true)
 * @Assert\NotBlank(groups={"edit", "registration"}, message="Email address is required")
 * @Assert\Email(groups={"edit", "registration"}, message="A valid email address is required")
 */
private $email;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank(groups={"edit", "registration"}, message="First name is required")
 */
private $fname;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank(groups={"edit", "registration"}, message="Last name is required")
 */
private $sname;

easy_admin.yaml(某些字段未显示):

edit:
    form_options: { validation_groups: ['edit'] }
    fields:
        - {property: 'fname', label: 'First name', type_options: { required: false }}
        - {property: 'sname', label: 'Last name', type_options: { required: false }}
        - {property: 'email', type: 'email', type_options: { required: false }}
new:
    form_options: { validation_groups: ['registration'] }
    fields:
        - {property: 'fname', label: 'First name', type_options: { required: false }}
        - {property: 'sname', label: 'Last name', type_options: { required: false }}
        - {property: 'email', type: 'email', type_options: { required: false }}

【问题讨论】:

  • 你能试试new: form_options: { validation_groups: ['edit'] } fields: 看看是否可行
  • 使用...{ validation_groups: ['edit'] } 的新表单可以识别验证注释,并在提交空字段时在表单中显示消息。这告诉我问题不在于验证组,而在于表单。
  • 这是一个参数异常,在你的设置器中添加?string ;) 这意味着你的参数将接受 null ,请告诉我你的设置器

标签: php symfony easyadmin


【解决方案1】:

这是一个参数异常。尝试更改您的 setters 参数以接受 null 参数。这应该可以工作并且会触发验证回调,例如:

public function setEmail(string $email): self
{
    $this->email= $email;

    return $this;
}

到这里:

public function setEmail(?string $email): self
{
    $this->email= $email;

    return $this;
}

【讨论】:

  • 我很好奇,为什么编辑和新表单之间有区别?他们不是提交相同的数据并使用相同的设置器吗?
  • 我认为如果没有更改字段,表单组件不会更新字段,不会调用 setter(就像在新对象的情况下一样)。我会在本地机器上测试它,我会用细节更新答案
  • FWIW 如果设置器中不存在类型提示,则验证器注释被识别。也许教训是,当使用验证器注释时,不需要严格的类型提示。
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多