我想建立一个导航栏,它显示在每个页面上。 因此,我将以下代码添加到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
}
现在表单代码应该可以工作了。