【问题标题】:Symfony embedded controller formSymfony 嵌入式控制器形式
【发布时间】:2015-04-23 18:53:32
【问题描述】:

我有一个带有一些选择框的搜索表单。我使用嵌入式控制器在每个页面的 headnavi 中呈现它。 (http://symfony.com/doc/current/book/templating.html#embedding-controllers) 我想使用表单输出重定向到我的列表视图页面,如下所示:

/list-view/{city}/{category}?q=searchQuery

当我通过路由调用控制器时,我的表单和请求运行良好,但不幸的是,当我嵌入控制器时,我遇到了两个问题。就像我在这里读到的 (Symfony 2 - Layout embed "no entity/class form" validation isn't working) 一样,由于子请求,我的请求没有被我的表单处理。答案中有一个解决方案,但不是很详细。 修复第一个问题后,另一个问题是我无法从嵌入式控制器 (Redirect from embedded controller) 进行重定向。 也许有人有一个更简单的解决方案,让我在每个页面上都有一个表单,让我重定向到它的数据?

非常感谢和问候 拉斐尔

【问题讨论】:

    标签: php forms symfony twig


    【解决方案1】:

    Symfony 2 - Layout embed "no entity/class form" validation isn't working 的答案是 100% 正确的,但是我们使用上下文并将它们隔离,因此始终使用主请求的操作会违反规则。 request_stack 中有所有请求(一个主请求和零个或多个子请求)。将Request $request 注入您的控制器操作是当前请求,它是只有max=3 的子请求(现在不推荐使用Request)。因此,您必须使用“正确”的请求。

    可以通过多种方式执行重定向,例如返回一些 JS 脚本代码进行重定向(恕我直言,这很丑陋)。我不会使用来自 twig 的子请求,因为那时开始重定向为时已晚,但在操作中发出子请求。我没有测试代码,但它应该可以工作。 Controller::forward 是你的朋友,因为它复制了当前执行子请求的请求。

    Controller.php(只是为了看看实现)。

    /**
     * Forwards the request to another controller.
     *
     * @param string $controller The controller name (a string like BlogBundle:Post:index)
     * @param array  $path       An array of path parameters
     * @param array  $query      An array of query parameters
     *
     * @return Response A Response instance
     */
    protected function forward($controller, array $path = array(), array $query = array())
    {
        $path['_controller'] = $controller;
        $subRequest = $this->container->get('request_stack')->getCurrentRequest()->duplicate($query, null, $path);
        return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
    }
    

    YourController.php

    public function pageAction() {
      $formResponse = $this->forward('...:...:form'); // e.g. formAction()
      if($formResponse->isRedirection()) {
        return $formResponse; // just the redirection, no content
      }
      $this->render('...:...:your.html.twig', [
        'form_response' => $formResponse
      ]);
    }
    
    public function formAction() {
      $requestStack = $this->get('request_stack');
      /* @var $requestStack RequestStack */
    
      $masterRequest = $requestStack->getCurrentRequest();
      \assert(!\is_null($masterRequest));
    
      $form = ...;
      $form->handleRequest($masterRequest);
    
      if($form->isValid()) {
        return $this->redirect(...); // success
      }
    
      return $this->render('...:...:form.html.twig', [
        'form' => $form->createView()
      ]);
    }
    

    your.html.twig

    {{ form_response.content | raw }}
    

    【讨论】:

    • 嘿 Aitch,感谢您的详细回答和代码示例!我按照你说的做了一切,并在我的基本模板上呈现“pageAction”。现在我收到此错误:第 1 行的 ControllerViews/Renders/form.html.twig 中不存在变量“form”
    • formAction 可以看到,我们在render() 中传递了form,您可以在form.html.twig 中使用它。在your.html.twigpageAction 中传递form_response,这是HTML,你可以在twig 中使用它。请仔细检查your.html.twig 中没有form 变量,并尝试了解控制器操作中发生的情况以找到问题。
    • 好的,我发现了问题。在 pageAction 中,我渲染了 form.html.twig 而不是 your.html.twig。现在我得到了表格,但它仍然无法正常工作。我觉得还是请求的问题,因为提交表单后,URL变成了这样--> ?form[search]=Test&form[category]=&form[type]=&form[location]=&form[send]= &form[_token]=nQCbivIi7IppDpaWtmEesLOOVEoPL7njJCPpXPlxxPg
    • 查看源 HTML。是 GET 形式的方法属性还是为空?错了,用form_start等twig函数创建表单
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2013-11-02
    • 1970-01-01
    • 2019-03-31
    • 2015-03-10
    相关资源
    最近更新 更多