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.
我正在使用 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.