2017-10-11 109 views
1

我試圖將Symfony的「自定義框架」應用程序重寫,但我不能一次做所有事情,所以我已將這個過程分成了幾個步驟。在非symfony應用程序中渲染symfony /窗體

從重要筆記 - 我已經實施了symfony/templating組件和symfony/twig-bridge組件。

這就是我想要的輸出模板的形式:

<?php echo $view['form']->form($form) ?> 

,因爲我這樣做了以下錯誤拋出:

Symfony\Component\Form\Exception\LogicException 
No block "form" found while rendering the form. 
/var/www/html/vendor/symfony/form/FormRenderer.php on line 98 

爲了使我使用的模板使用PhpEngineTwigEngineDelegatingEngine

設置與\Symfony\Bridge\Twig\Extension\FormExtension樹枝是well documented,但我缺少的是PHP設置。這是我如何做到這一點:

new \Symfony\Component\Form\Extension\Templating\TemplatingExtension($phpEngine, $this->csrfManager()); 

你能指出我缺少什麼或者我的設置有什麼問題嗎?

回答

1

我找到了答案:

我使用了錯誤的FormRendererEngineInterface。相反,依靠\Symfony\Component\Form\Extension\Templating\TemplatingExtension類的我已經通過自己註冊的form幫手:

$phpEngine = new PhpEngine(new TemplateNameParser(), new FilesystemLoader(realpath(__DIR__.'/../Template').'/%name%')); 
$twigEngine = new TwigEngine($this->twig(), new TemplateNameParser()); 

$this->TemplateEngine = new DelegatingEngine(array(
    $phpEngine, 
    $twigEngine, 
)); 

$phpEngine->addHelpers(array(
    new FormHelper(new FormRenderer($this->twigFormRendererEngine())), 
)); 

正如你可以在TemplatingEngine看到:

public function __construct(PhpEngine $engine, CsrfTokenManagerInterface $csrfTokenManager = null, array $defaultThemes = array()) 
    { 
     $engine->addHelpers(array(
      new FormHelper(new FormRenderer(new TemplatingRendererEngine($engine, $defaultThemes), $csrfTokenManager)), 
     )); 
    } 

它依賴於TemplatingRendererEngine,而我需要的TwigRendererEngine實例,因爲表單模板是樹枝文件。

糾正我,如果我的解釋是錯誤的,但解決方案正在工作。

1

我認爲最簡單的方法是將Symfony 3.3標準版安裝在應用程序旁邊(等待Symfony Flex發佈)。

之後,找到一種方法來使用Symfony的路由器與您的應用程序的路由器。

所以,你可以有充分的Symfony框架,在它創建表單類型,讓Symfony的渲染它:

  1. 隨着舊應用程式Ajax調用
  2. 隨着新Symfony Kernel
+0

這是一個不錯的主意,但它會涉及到項目的混亂:/ – Roomy