2017-10-11 64 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