2017-08-01 35 views
0

私はenum型フィールドを持つsymfonyエンティティを持っています。私はそれに対してフォームタイプを生成したいと思います。 私はそれを行う正しい方法を知りたいです。 symfony Enum型with formType

この

は私の実体である:

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

エンティティのアノテーションと同じように列挙型を設定できます。しかし、それがあなたのenumの一部であることを確かめるためには、関数setTypeで渡す文字列を確保する必要があります。

あなたはこの

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

は次にフォームで、あなたのChoiceTypeから渡されたデータベースに保存する値は、あなたの列挙型のようなものであることを確認するだろう行う必要があります。ところで、文字列を返すタイプを選択することはできますが、選択した文字列を選択できるので、ChoiceTypeがこの場合に最適です。しかし、彼が他の価値を渡していないことを確かめるために、上のようにサーバー側でセッターを固定するのがよい方法です。

そうでなければ、hereまたは hereが見つかる可能性があるEnumの特定のタイプを作成する別のソリューションを使用できますが、最初の解決策は問題ありません。