在非 symfony 应用程序中呈现 symfony/form

rendering symfony/form in non-symfony application

我正在尝试为 Symfony 重写一个 "custom framework" 应用程序,但我不能一次完成所有事情,所以我将过程分成几个步骤。

来自重要说明 - 我已经实现了 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

为了呈现模板,我使用 DelegatingEngine,它使用 PhpEngineTwigEngine

使用 \Symfony\Bridge\Twig\Extension\FormExtension 设置 Twig 是 well documented,但我缺少的是 php 设置。我就是这样做的:

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

你能指出我遗漏了什么或我的设置有什么问题吗?

我认为最简单的方法是在您的应用旁边安装 Symfony 3.3 标准版(等待 Symfony Flex 发布)。

在此之后,想办法将 Symfony 的路由器与您的应用程序的路由器一起使用。

因此您可以拥有完整的 Symfony 框架,在其中创建您的表单类型并让 Symfony 呈现它:

  1. 通过 ajax 通话
  2. 在您的旧版应用中使用新的Symfony Kernel

我找到了答案:

我用错了FormRendererEngineInterface。我没有依赖 \Symfony\Component\Form\Extension\Templating\TemplatingExtension class,而是自己注册了 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())),
));

如您在模板引擎中所见:

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 实例,因为表单模板是 twig 文件。

如果我的解释有误,请纠正我,但解决方案有效。