FOSUserBundle 不工作验证

FOSUserBundle not working Validation

我正在使用 symfony 3.3 和 php 7.0 以及 FOSUserBundle 版本 2.1.1,我只是意识到在用户实体中,如果您只是在设置器参数中添加类型提示,例如这样。 .. 验证将失败。

<?php
namespace AppBundle\Entity;

use ...;

/**
 * @ORM\Entity
 * @ORM\Table(name="`user`")
 */
class User extends BaseUser
{
    /**
     * @Assert\NotBlank()
     * @var string
     * @ORM\Column(type="string", nullable=false)
     */
    private $firstName;

   /**
    * @return string
    */
    public function getFirstName()
    {
        return $this->firstName;
    }
    /**
    * @param string $firstName
    */
    public function setFirstName(string $firstName) <- IF YOU ADD THIS STRING AS THE PARAMETER THE VALIDATION FAILS
    {
        $this->firstName = $firstName;
    }
}

所以最后一行应该是这样的:

public function setFirstName($firstName)

如果有人知道如何在不给验证带来问题的情况下添加类型提示,那么听到消息会很好。

显然,如果您想使用验证功能,FOSUserBundle 目前不允许类型提示。

您在用户 class 中的方法 setFirstName() 必须与 FOSUserBundle/Model/UserInterface->setFirstName($username)

兼容

该接口没有类型提示,因此您不能在您的方法中添加类型提示...

这是 Symfony 验证器默认的工作方式:它首先设置值(例如 null),然后执行验证,而不是其他方式。因为你的方法不接受 null 值,只接受字符串:

public function setFirstName(string $firstName)

您很可能遇到错误 Exception: Argument 1 passed to setFirstName() must be of the type string, null given

为了克服这个问题,您必须将相应字段的空数据设​​置为 ''detach your entities from the form component。或者您可以强制方法接受空值:

// php 7
public function setFirstName(string $firstName = null)
{
    $this->firstName = (string) $firstName;
}

// >= php7.1
public function setFirstName(?string $firstName)

我敦促您停止将实体与表单和验证器混合使用。您的核心域应该没有这种低级别的问题(参见 SRP from the SOLID). Also by the look of your setters I can tell you are moving towards the antipattern called Anemic Domain Model.