我有两个双向关系的类:Player
和Team
每个玩家必须有一个团队,每个团队可以有多个玩家。
当我使用默认表单字段(选择)并提交0
(通过手动编辑HTML)时,表单错误会正确显示。但是,如果我使用自定义表单字段类型并提交0
,则没有表单错误,而是出现了一个异常:
可捕获的致命错误:参数1传递给…''Entity''Player::setTeam()必须是…的实例。。。''实体''团队,给定null,在中调用…''vendor''symfony''symfony ''src''symfony''Component''PropertyAccess''PropertyAAccessor.php在第360行,定义在。。。''实体''播放器.php第58行
如何显示普通表单错误而不是此异常?
我的课程是直线前进的(只张贴相关部分):
Team.php
class Team {
/**
* @ORM'OneToMany(targetEntity="...'Entity'Player", mappedBy="team")
*/
protected $players;
}
Player.php
class Player {
/**
* @var Team
*
* @ORM'ManyToOne(targetEntity="...'Entity'Team", inversedBy="players")
* @ORM'JoinColumn(name="team_id", referencedColumnName="id", nullable=false)
* @Assert'Valid
*/
protected $team;
/**
* Set team
*
* @param Team $team
* @return Player
*/
public function setTeam(Team $team) {
$this->team = $team;
return $this;
}
/**
* Get team
*
* @return Team
*/
public function getTeam() {
return $this->team;
}
}
我的DataTransformer的reverseTransform
函数如下所示:
public function reverseTransform($value)
{
if(!$value)
{
return $this->multiple ? array() : 0;
}
//... get entity
}
如果您使用自定义数据转换器创建了自定义表单字段,则您有责任验证客户端数据。要获得通用消息(This value is not valid
),您需要在数据转换器中抛出一个TransformationFailedException
。然后,所有内容都将由表单组件处理。
编辑:默认情况下,Symfony核心中的大多数数据转换器将空白值转换为null
。数据转换器的职责是将客户端数据转换为模型数据,并最终检测重大错误,如选择列表的不可接受值或日期时间字段等情况下的数据丢失。它不是验证数据,这是验证器组件的责任。然后,它让验证器组件进行最终验证,这通常比简单的数据转换器更复杂。IMHO,您目前正在混合数据转换器和验证问题。
编辑:此外,您需要在域对象中允许数据转换器返回的内容(此处为null值)。