symfony 3表单不适用于twig渲染(控制器(' ...'))

时间:2017-08-16 12:27:51

标签: php forms symfony twig

我想构建一个导航栏,它会显示在每个页面上。 因此,我将以下代码添加到base.html.twig

{{ render(controller(
    'AppBundle:Navigation:index'
)) }}

但是$form->isSubmitted()会返回false$form->getData()会返回null。这只是上面的树枝渲染方式的情况。如果我通常通过/navigation - 路线打开导航:索引页面,$form->isSubmitted()会返回true$form->getData()会返回表单数据。

这是NavigationController:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Entity\Language;
use Doctrine\ORM\EntityManagerInterface;
use AppBundle\Form\Type\NavigationType;
class NavigationController extends Controller
{
    /**
     * @Route("/navigation", name="navigation")
     */
    public function indexAction(Request $request, EntityManagerInterface $em)
    {
        $language = null;
        $form = $this->createForm(NavigationType::class);

        $form->handleRequest($request);
        dump($language);
        dump($form);
        if($form->isSubmitted() && $form->isValid())
        {
            dump('is valid');
        }
        $data = $form->getData();
        dump($data);
        dump('isSubmitted(): ' . $form->isSubmitted());
        dump($form->isSubmitted());

        // replace this example code with whatever you need
        return $this->render('navigation/index.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

有没有人有解决方法?

2 个答案:

答案 0 :(得分:0)

好的,我现在找到了解决方法。需要手动提供$request - 对象

找到here的方法。

只需将树枝代码更改为:

{{ render(controller("SomeBundle:Foo:bar", {'request': app.request) }}

并在action-function中添加$ request变量

public function barAction($request) {
    // other your code
}

现在表单代码应该可以工作。

答案 1 :(得分:0)

如果您嵌入了控制器,Symfony会通过内部子请求来执行此操作,这就是为什么isSubmitted为false,并且getData返回null。

解决方法是传递原始请求,如您找到的那样。

更好的选择是使用请求堆栈(可通过request_stack服务IIRC获得)及其getMasterRequest方法。