Symfony 3 表单不适用于 Twig render(controller('...'))



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

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

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

下面是导航控制器:

<?php
namespace AppBundleController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use AppBundleEntityLanguage;
use DoctrineORMEntityManagerInterface;
use AppBundleFormTypeNavigationType;
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(),
));
}
}

有人有解决方法吗?

如果你嵌入了一个控制器,Symfony通过一个内部的子请求来完成,这就是为什么isSubmit是假的,getData返回null。

解决方法是传递原始请求,如您所发现的。

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

好的,我现在找到了解决方法。需要手动使$request对象可用

执行此操作的方法可在此处找到。

只需将树枝代码更改为:

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

并在操作函数中添加$request变量

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

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

最新更新