Php 缺少Symfony强制参数

Php 缺少Symfony强制参数,php,symfony,url,routes,Php,Symfony,Url,Routes,我使用Symfony表单组件向用户显示编辑表单(用于编辑问题) 单击编辑按钮时,我在控制器中使用此功能来呈现编辑表单: /** * Display edit form * @Route("/edit/question/{id}", name="app_question_edit", methods={"GET"}) * @param Question $question * @return Response */ public

我使用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模板中设置如下):

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

但我得到了以下错误:

在呈现模板期间引发了异常(“缺少某些必需参数(“id”)以生成路由“app\u question\u update”的URL)


当我删除slug和Question$Question参数时,表单被呈现,当我在提交后添加请求时,我也可以看到表单数据,但我缺少问题id+我想让它与slug一起工作。

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

<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>
{{ path('app_question_update', {slug: quetionId}) }}
但在此之前,您必须将
问题ID
传递到编辑控制器中的视图:

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

您应该在细枝的路径方法中添加一个
slug
参数

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

您需要自己将
slug
参数传递给表单操作中的
path()
函数。您可以从
questionEditForm.vars
获取它,这样您就不必向视图传递其他对象。啊,我想我已经掌握了窍门!非常感谢。
{{ form_start(questionEditForm, {'action': path('app_question_update', {slug: questionEditForm.vars.value.slug}), 'method': 'PUT'}) }}