当表单在单独的树枝中呈现时如何访问表单输入?

How to access a form input when the form is rendered in a separate twig?

我想在我的导航栏中创建一个搜索栏,这样就可以简单地在我的页面上搜索用户。

我有一个 base.html.twig,其中定义了导航栏、页眉、页脚等,以使我的所有页面具有相同的布局。然后我有每个子页面,例如a profile.html.twig,它定义了页面的实际内容。

我想在导航栏中包含一个搜索行,所以我阅读了有关嵌入控制器的内容,这对我来说似乎是个完美的主意。所以我创建了一个 SearchForm class,它构建了一个带有 FormBuilderInterface 的表单,如下所示:

class SearchForm extends AbstractType
{
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
         $builder
              ->add('searched_name')
        ;
    }
}

然后我创建了一个 SearchController,它将包含提交搜索表单时应该发生的事情的逻辑,并且应该 return 呈现表单。

class SearchController extends AbstractController
{
    /**
     * @param Request $request
     *
     * @return Response|RedirectResponse
     *
     * @Route("/search", name="search", methods={"GET","POST"})
     */
    public function renderSearch(Request $request) {
        $form = $this->createForm(SearchForm::class);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            return $this->redirectToRoute('ping');
            //TODO: Implement search logic
        }
        return $this->render('searchForm.html.twig', [
            'form' => $form->createView()
        ]);
    }
}

我想,我现在可以简单地继续让搜索表单呈现在 base.html.twig:

<div class="topnav" id="navbar">
    <a href="/start">Startseite</a>
    <a href="/overview">Übersicht</a>
    <a href="/about">Über uns</a>
    {{ render(url('search')) }}
    <a href="/profile" style="float:right">
        {% if app.user %}
            {{ app.user.username }}
        {% else %}
            Mein Profil
        {% endif %}
    </a>
</div>

它确实被渲染了,但问题是,一旦我按 Enter 键提交带有搜索输入的表单,POST 请求就不会发送到 searchController,但是无论哪个控制器负责处理,比方说,配置文件页面。

我想它必须对在那里呈现的整个网站做一些事情,因为我只是继承了我所有其他页面中的 base.html.twig,所以提交请求被发送到那里。我通过直接调用搜索路由来测试它,它完全可以正常工作。

如何在每个站点上制作此模板,而不必在每个控制器中重新实现搜索逻辑? (毕竟,这就是这个基地的目的......)

首先你可以(当然)设置表单的动作属性。按照此 link 了解如何操作:https://symfony.com/doc/4.2/form/action_method.html

但是由于您在网站的每个页面上都显示了表单,因此您应该问问自己是否要在提交表单后将用户重定向到其他页面。答案可能是肯定的,也可能不是,但如果不是,那么您就有机会使用 AJAX 提交。