Symfony 强制参数缺失

Posted

技术标签:

【中文标题】Symfony 强制参数缺失【英文标题】:Symfony mandatory parameters missing 【发布时间】:2021-08-12 13:24:41 【问题描述】:

我正在使用 Symfony 表单组件向用户显示一个编辑表单(用于编辑问题)。

单击编辑按钮时,我在控制器中使用此功能来呈现编辑表单:

/**
 * Display edit form
 * @Route("/edit/question/id", name="app_question_edit", methods="GET")
 * @param Question $question
 * @return Response
 */
public function edit(Question $question): Response

    $form = $this->createForm(QuestionFormType::class, $question);
    
    return $this->render('question/edit.html.twig',[
        'questionEditForm' => $form->createView()
    ]);

因此,示例 url 将是“/edit/question/1

表单操作是对另一个路由的 PUT 请求(在 twig 模板中设置如下):

<div class="container mt-2" id="one-question">
       form_start(questionEditForm, 'action': path('app_question_update'), 'method': 'PUT') 
       form_widget(questionEditForm) 
      <button type="submit" class="btn btn-secondary edit-question-btn mt-2">
         Update
      </button>
       form_end(questionEditForm) 
   </div>

我正在使用控制器中的另一个函数来处理请求(是的,这不是最佳做法,我只是在玩弄)。

    /**
     * @Route("/questions/slug", name="app_question_update", methods="PUT")
     * @param Request $request
     * @param Question $question
     * @param EntityManagerInterface $entityManager
     * @return RedirectResponse
     */
    public function update(Question $question, Request $request, EntityManagerInterface $entityManager): RedirectResponse
    
        dd($question);
        // ...
    

为了更新正确的问题,我需要这个问题。 所以我虽然通过Question $question,Symfony 将使用在 slug 中找到的 id 来执行“findOneBy”(而不是直接传递 id 等)。

但我收到以下错误:

在呈现模板期间引发了异常(“缺少一些强制参数(“id”)以生成路由“app_question_update”的 URL。”)。

当我删除 slug 和 Question $question 参数时,会呈现表单,当我在提交后 dd 请求时,我也可以看到表单数据,但我缺少问题 ID + 我想得到这个与蛞蝓一起工作。

【问题讨论】:

您需要自己将slug 参数传递给表单操作中的path() 函数。您可以从 questionEditForm.vars 获取它,因此您不必将其他对象传递给您的视图。 啊,我想我已经掌握了窍门!谢谢! 【参考方案1】:

您必须将slug 参数传递给树枝模板中的 path() 函数:

 path('app_question_update', slug: quetionId) 

但在此之前,您必须将 questionId 传递给您编辑控制器中的视图:

    return $this->render('question/edit.html.twig',[
        'questionEditForm' => $form->createView(),
        'questionId' => $question->getId()
    ]);

【讨论】:

【参考方案2】:

你应该在twig的path方法中添加一个slug参数

 form_start(questionEditForm, 'action': path('app_question_update', slug: questionEditForm.vars.value.slug), 'method': 'PUT') 

【讨论】:

以上是关于Symfony 强制参数缺失的主要内容,如果未能解决你的问题,请参考以下文章

如何强制用户注销 symfony2

Symfony2:如何为整个应用程序强制使用 HTTPS?

首次登录 symfony 应用程序时强制更改密码

如何强制为特定 PHP 版本创建新的 Symfony 应用程序?

Symfony 5 如何为 argon2 存储盐?

使用 Twig 和 Symfony2 在 javascript 中生成路由