在非 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
,它使用 PhpEngine
和 TwigEngine
。
使用 \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 呈现它:
- 通过 ajax 通话
- 在您的旧版应用中使用新的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 文件。
如果我的解释有误,请纠正我,但解决方案有效。
我正在尝试为 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
,它使用 PhpEngine
和 TwigEngine
。
使用 \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 呈现它:
- 通过 ajax 通话
- 在您的旧版应用中使用新的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 文件。
如果我的解释有误,请纠正我,但解决方案有效。