2017-08-16 68 views
1

我想構建一個導航欄,它顯示在每個頁面上。 因此添加以下代碼到base.html.twigsymfony 3表單不能用樹枝渲染(控制器('...'))

{{ 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(), 
     )); 
    } 
} 

有誰有解決方法嗎?

回答

0

如果你嵌入了一個控制器,Symfony通過一個內部子請求來完成它,這就是爲什麼isSubmitted是false,並且getData返回null。

解決方法是通過原始請求,如您所見。

更好的選擇是使用請求堆棧(可通過request_stack服務IIRC)及其getMasterRequest方法。

0

好了,我現在找到了一個解決辦法。需要手動提供$request對象

找到此方法的方法是here

就在樹枝代碼更改爲:

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

,並在行動的職能添加$ request變量

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

現在形式的代碼應該工作。

+0

我有類似的問題。我可以用認爲該路線是被渲染,然後調用如上呈現模板控制器的目的地控制器所使用的控制器或路徑名,但我KNP分頁呼叫樹枝渲染。 – RichieHH