我如何指定先例表格的对象?

How Can I specified the object of my precedent form?

在我的项目中,我想使用我的先例形式创建的对象:

这是我的数据库的架构:

我的测验控制器

public function creation(Request $request){
        $quiz = new Quiz();
        $user = $this->getUser();

        $formQuiz = $this->createForm(QuizType::class, $quiz);

        $formQuiz->handleRequest($request);
  

        if ($formQuiz->isSubmitted() && $formQuiz->isValid() ) {
            $quiz->setCreatedAt(new DateTimeImmutable());
            $quiz->setCreatedBy($user);
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($quiz);
            $entityManager->flush();

            return $this->redirectToRoute('creation_questions');
        }
        return $this->render('quiz/creation.html.twig', [
            'formQuiz' => $formQuiz->createView(),
        ]);
    }

还有我的 QuestionController 必须与测验表单连接

public function creation_questions(Request $request){
        $quiz = ?
        $question = new Questions();

        $formQuestions = $this->createForm(QuestionType::class, $question);
        
        $formQuestions->handleRequest($request);

        if ($formQuestions->isSubmitted() && $formQuestions->isValid() ) {
            $question->setCreatedAt(new DateTimeImmutable());
            $question->setQuiz($quiz);
 
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($question);
  
            $entityManager->flush();

            return $this->redirectToRoute('home');
        }
        return $this->render('questions/questions.html.twig', [
            'formQuestion' => $formQuestions->createView()
        ]);
    }

我必须写什么来代替“?”?

您没有显示您的路由,但您可以使用 SensioFrameworkExtraBundle 中的 paramConverte“魔法”并执行类似的操作。

/**
 * @Route("/some-route/{id}", name="some_route_name")
 */
public function creation_questions(Request $request, Quiz $quiz)
{
    $question = new Questions();

    $formQuestions = $this->createForm(QuestionType::class, $question);

    $formQuestions->handleRequest($request);

    if ($formQuestions->isSubmitted() && $formQuestions->isValid()) {
        $question->setCreatedAt(new DateTimeImmutable());
        $question->setQuiz($quiz);

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($question);

        $entityManager->flush();

        return $this->redirectToRoute('home');
    }
    return $this->render('questions/questions.html.twig', [
        'formQuestion' => $formQuestions->createView()
    ]);
}

其中 /someRoute/{id}{id} 部分是测验 ID。 Symfony 应该自动获取匹配该 id 的测验。或者您可以更明确地说明参数转换器应如何解释这样的值。更多信息在这里 https://symfony.com/bundles/SensioFrameworkExtraBundle/current/annotations/converters.html

或者,您可以传递测验 ID 并手动获取测验(不那么神奇但完全合法)。

/**
 * @Route("/some-route/{id}", name="some_route_name")
 */
public function creation_questions(Request $request, int $id)
{
    $entityManager = $this->getDoctrine()->getManager();
    $quiz = $entityManager->getRepository(Quiz::class)->find($id);
    $question = new Questions();

    $formQuestions = $this->createForm(QuestionType::class, $question);

    $formQuestions->handleRequest($request);

    if ($formQuestions->isSubmitted() && $formQuestions->isValid()) {
        $question->setCreatedAt(new DateTimeImmutable());
        $question->setQuiz($quiz);

        $entityManager->persist($question);

        $entityManager->flush();

        return $this->redirectToRoute('home');
    }
    return $this->render('questions/questions.html.twig', [
        'formQuestion' => $formQuestions->createView()
    ]);
}