如果“0”与自定义表单字段一起提交,则ManyToOne JoinColumn(不可为null)不显示表单错误


ManyToOne JoinColumn (not nullable) not showing form error if `0` submitted with custom form field

我有两个双向关系的类:PlayerTeam每个玩家必须有一个团队,每个团队可以有多个玩家。

当我使用默认表单字段(选择)并提交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值)。