Symfony form collection


Symfony form collection

在Symfony中,我有两个实体:问答。它们具有一对多的关系,一个问题可以有多个答案。使用你的实体,我正在尝试构建一个带有文本字段的表单,用户可以在其中编辑来自实体的数据。阅读Symfony食谱文档,我明白我需要使用一组表单来显示问题的多个答案。据我了解,问题表单将生成问题数据,这也将嵌入包含所有答案的答案表单。在这一点上,我遇到了这个错误:

无法加载类型"测验包''实体''答案

有人可以帮助我解决这个问题并用问题和答案构建表格吗?谢谢

这是我的答案实体:

/**
 * Answer
 *
 * @ORM'Table(name="answerswer")
 * @ORM'Entity(repositoryClass="QuizBundle'Repository'AnswerRepository")
 */
class Answer
{
    /**
     * @ORM'ManyToOne(targetEntity="Question", inversedBy="answerswers")
     * @ORM'JoinColumn(name="question_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $question;
    /**
     * @var int
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORM'Column(name="answerswer", type="string", length=255)
     */
    private $answer;
    /**
     * @var bool
     *
     * @ORM'Column(name="isCorrect", type="boolean")
     */
    private $isCorrect;
    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set answer
     *
     * @param string $answer
     *
     * @return Answer
     */
    public function setAnswer($answer)
    {
        $this->answer = $answer;
        return $this;
    }
    /**
     * Get answer
     *
     * @return string
     */
    public function getAnswer()
    {
        return $this->answer;
    }
    /**
     * Set isCorrect
     *
     * @param boolean $isCorrect
     *
     * @return Answer
     */
    public function setIsCorrect($isCorrect)
    {
        $this->isCorrect = $isCorrect;
        return $this;
    }
    /**
     * Get isCorrect
     *
     * @return bool
     */
    public function getIsCorrect()
    {
        return $this->isCorrect;
    }
    /**
     * Set question
     *
     * @param 'QuizBundle'Entity'Question $question
     *
     * @return Answer
     */
    public function setQuestion('QuizBundle'Entity'Question $question = null)
    {
        $this->question = $question;
        return $this;
    }
    /**
     * Get question
     * @return 'QuizBundle'Entity'Question
     */
    public function getQuestion()
    {
        return $this->question;
    }
}

问题实体:

/**
 * Question
 *
 * @ORM'Table(name="question")
 * @ORM'Entity(repositoryClass="QuizBundle'Repository'QuestionRepository")
 */
class Question
{
    /**
     * @ORM'OneToMany(targetEntity="Answer", mappedBy="question", cascade={"remove"}, orphanRemoval=true)
     */
    private $answers;
    public function __construct()
    {
        $this->answers = new ArrayCollection();
    }
    /**
     * @var int
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORM'Column(name="image", type="string", length=255)
     */
    private $image;
    /**
     * @var string
     *
     * @ORM'Column(name="question", type="string", length=255)
     */
    private $question;
    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set image
     *
     * @param string $image
     *
     * @return Question
     */
    public function setImage($image)
    {
        $this->image = $image;
        return $this;
    }
    /**
     * Get image
     *
     * @return string
     */
    public function getImage()
    {
        return $this->image;
    }
    /**
     * Set question
     *
     * @param string $question
     *
     * @return Question
     */
    public function setQuestion($question)
    {
        $this->question = $question;
        return $this;
    }
    /**
     * Get question
     *
     * @return string
     */
    public function getQuestion()
    {
        return $this->question;
    }
    /**
     * Add answer
     *
     * @param 'QuizBundle'Entity'Answer $answer
     *
     * @return Question
     */
    public function addAnswer('QuizBundle'Entity'Answer $answer)
    {
        $this->answers[] = $answer;
        return $this;
    }
    /**
     * Remove answer
     *
     * @param 'QuizBundle'Entity'Answer $answer
     */
    public function removeAnswer('QuizBundle'Entity'Answer $answer)
    {
        $this->answers->removeElement($answer);
    }
    /**
     * Get answers
     *
     * @return 'Doctrine'Common'Collections'Collection
     */
    public function getAnswers()
    {
        return $this->answers;
    }
}

问题表格:

class QuestionFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('image');
        $builder->add('question');
        $builder->add('answers', CollectionType::class, array('entry_type' => Answer::class));
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class' => 'QuizBundle'Entity'Question'));
    }
    public function getName()
    {
        return 'quiz_bundle_question_form_type';
    }
}

答卷:

class AnswerFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('answer');
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class' => 'QuizBundle'Entity'Answer'));
    }
    public function getName()
    {
        return 'quiz_bundle_answer_form_type';
    }
}

控制器代码:

public function adminEditRecordAction(){

尝试从DB获取问题和答案

        $question = $this->getDoctrine()->getRepository('QuizBundle:Question')->findOneByIdJoinedToCategory(1);
        $question = new Question();
        $answer = new Answer();
        $answer->setAnswer('answerrr1');
        $answer->setIsCorrect(false);
        $question->getAnswers()->add($answer);
        $form = $this->createForm(QuestionFormType::class, $question);
        return $this->render('QuizBundle:Default:editRecord.html.twig', array('form' => $form->createView()));
    }

您的表单类在此处出现错误:

$builder->add('answers', CollectionType::class, array('entry_type' => Answer::class));

正如Symfony的文档所说:

这是此集合中每个项目的字段类型(例如,文本类型、选择类型等)。(...)

您已经提供了实体的类名(Answer::class),而它应该是某个FormType的类名(例如 AnswerType:::class )。