Php 带有formType的Symfony枚举类型
我有一个symfony实体,它有一个枚举类型字段,我想为它生成一个表单类型。 我想知道这样做的正确方法 这是我的实体:Php 带有formType的Symfony枚举类型,php,forms,symfony,enums,entity,Php,Forms,Symfony,Enums,Entity,我有一个symfony实体,它有一个枚举类型字段,我想为它生成一个表单类型。 我想知道这样做的正确方法 这是我的实体: <?php namespace EvalBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * SessionEvaluation * * @ORM\Table(name="session_evaluation") * @ORM\Entity(repositoryClass="EvalBundle\Repo
<?php
namespace EvalBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* SessionEvaluation
*
* @ORM\Table(name="session_evaluation")
* @ORM\Entity(repositoryClass="EvalBundle\Repository\SessionEvaluationRepository")
*/
class SessionEvaluation
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, unique=true)
*/
private $name;
/**
* @var \DateTime
*
* @ORM\Column(name="startDate", type="datetime")
*/
private $startDate;
/**
* @var \DateTime
*
* @ORM\Column(name="endDate", type="datetime")
*/
private $endDate;
/**
* @var string
*
* @ORM\Column(name="type", type="string", columnDefinition="enum('annual', 'intermediate')")
*/
private $type;
/**
* One SessionEvaluation has Many PerformanceEvaluation.
* @ORM\OneToMany(targetEntity="PerformanceEvaluation", mappedBy="sessionEvaluation")
*/
private $performanceEvaluations;
/**
* One SessionEvaluation has Many Evaluation.
* @ORM\OneToMany(targetEntity="Evaluation", mappedBy="sessionEvaluation")
*/
private $evaluations;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return SessionEvaluation
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set startDate
*
* @param \DateTime $startDate
*
* @return SessionEvaluation
*/
public function setStartDate($startDate)
{
$this->startDate = $startDate;
return $this;
}
/**
* Get startDate
*
* @return \DateTime
*/
public function getStartDate()
{
return $this->startDate;
}
/**
* Set endDate
*
* @param \DateTime $endDate
*
* @return SessionEvaluation
*/
public function setEndDate($endDate)
{
$this->endDate = $endDate;
return $this;
}
/**
* Get endDate
*
* @return \DateTime
*/
public function getEndDate()
{
return $this->endDate;
}
/**
* Set type
*
* @param string $type
*
* @return SessionEvaluation
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Get type
*
* @return string
*/
public function getType()
{
return $this->type;
}
public function __toString() {
return $this->name;
}
}
可以像在实体中使用注释一样设置枚举类型。但是,您必须确保在函数setType中传递的字符串是安全的,以确保它是枚举的一部分
你应该这样做
public function setType($type)
{
if (!in_array($type, array('annual', 'intermediate'))) {
throw new \InvalidArgumentException("Invalid type");
}
$this->type = $type;
}
然后在表单中,您将确保ChoiceType传递的要保存在数据库中的值与枚举类似。顺便说一下,您可以选择任何返回字符串的类型,但ChoiceType在这种情况下是最好的,因为您的用户可以选择您选择的字符串。但为了确保他不会传递其他值,在服务器端保护setter是一种很好的做法,如上所述
否则,您仍然可以使用另一个解决方案,该解决方案包括为可以找到的枚举创建特定类型,但第一个解决方案没有问题
public function setType($type)
{
if (!in_array($type, array('annual', 'intermediate'))) {
throw new \InvalidArgumentException("Invalid type");
}
$this->type = $type;
}