我有两个双向关系类:Player
和Team
每个玩家必须只有一个团队,每个团队可以有很多玩家。
当我使用默认表单字段(选择)并提交0
(通过手动编辑HTML)时,表单错误会正确显示。但是,如果我使用自定义表单字段类型并提交0
,则表示没有表单错误,但是例外:
捕获致命错误:参数1传递给 ... \ Entity \ Player :: setTeam()必须是... \ Entity \ Team的实例, null,给出,调用 ... \供应商\ symfony的\ symfony中的\ src \的Symfony \分量\ PropertyAccess \ PropertyAccessor.php 在第360行并在...... \ Entity \ Player.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
}
答案 0 :(得分:2)
如果您使用自定义数据转换器创建了自定义表单字段,则您有责任验证客户端数据。要获取通用消息(This value is not valid
),您需要在数据转换器中抛出TransformationFailedException
。然后,所有内容都将由表单组件处理。
编辑:默认情况下,Symfony核心中的大多数数据转换器会将空白值转换为null
。数据转换器的职责是将客户端数据转换为模型数据,并最终检测主要错误,如选择列表的不可接受的值或日期时间字段等情况下的丢失数据。不是要验证数据是什么验证器组件的可靠性。然后,它允许验证器组件进行最终验证,这通常比简单的数据转换器更复杂。恕我直言,您目前正在混合数据变换器和验证问题。
编辑:此外,您需要在域对象中允许数据转换器返回自身(此处为空值)。