如果使用自定义表单字段提交“0”,则ManyToOne JoinColumn(不可为空)不显示表单错误

时间:2014-04-28 10:15:28

标签: php symfony symfony-forms

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

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

1 个答案:

答案 0 :(得分:2)

如果您使用自定义数据转换器创建了自定义表单字段,则您有责任验证客户端数据。要获取通用消息(This value is not valid),您需要在数据转换器中抛出TransformationFailedException。然后,所有内容都将由表单组件处理。

编辑:默认情况下,Symfony核心中的大多数数据转换器会将空白值转换为null。数据转换器的职责是将客户端数据转换为模型数据,并最终检测主要错误,如选择列表的不可接受的值或日期时间字段等情况下的丢失数据。不是要验证数据是什么验证器组件的可靠性。然后,它允许验证器组件进行最终验证,这通常比简单的数据转换器更复杂。恕我直言,您目前正在混合数据变换器和验证问题。

编辑:此外,您需要在域对象中允许数据转换器返回自身(此处为空值)。