2017-08-01 91 views
0

我有一個symfony實體具有枚舉類型字段,我想爲它生成一個表單類型。 我想知道正確的方法來做到這一點。Symfony枚舉類型與表單類型

這是我的實體:

<?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; 
    } 
} 

這裏是formType:

<?php 

namespace EvalBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Form\Extension\Core\Type\DateType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class SessionEvaluationType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('Name', TextType::class, array(
      'attr'=> array('class'=>'form-control') 
     )) 
       ->add('startDate', DateType::class, array(
        'format' => 'yyyy MM dd' 
       )) 
       ->add('endDate') 
       ->add('type', ChoiceType::class, array(
        'choices' => array(
         'Annuel' => true, 
         'Itérmidaire' => false, 
        ), 
        'attr' => array('class' => 'dropdown') 

       )) 
      ->add('Lancer', SubmitType::class, array(
       'attr' => array('class' => 'btn btn-primary'))); 

    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'EvalBundle\Entity\SessionEvaluation' 
     )); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getBlockPrefix() 
    { 
     return 'evalbundle_sessionevaluation'; 
    } 


} 

用枚舉類型的字段是:類型

我定義它作爲表單中的choiceType,這是在提交後將實體實例保存在數據庫中的一種好方法 表格 ?

回答

1

枚舉類型可以像您在實體中使用註釋一樣進行設置。但是你必須確保函數setType中的字符串是傳遞的,以確保它是你的枚舉的一部分。

你應該在你的形式做這個

public function setType($type) 
{ 
    if (!in_array($type, array('annual', 'intermediate'))) { 
     throw new \InvalidArgumentException("Invalid type"); 
    } 
    $this->type = $type; 
} 

然後,你一定會認爲該值在數據庫中的ChoiceType通過保存就像是你的枚舉。順便說一下,您可以選擇返回字符串的任何類型,但ChoiceType在這種情況下是最好的選擇,因爲您的用戶可以選擇您選擇的字符串。但爲了確保他沒有通過其他價值,這是一個很好的做法,以保護像上面的服務器端的setter。

否則,您仍然可以使用另一種解決方案,它們是爲您的Enum創建一個特定的類型,可以找到here here但第一個解決方案是好的。