【发布时间】:2016-01-30 17:14:18
【问题描述】:
我正在编写一个具有以下功能的系统:普通用户(没有程序员或管理员)可以创建可以插入“占位符”的内容。呈现页面时,这些占位符将替换为不同的内容类型(例如,十六进制颜色代码、滑块、图像……)。占位符的替换有点复杂,并且有一些额外的功能(例如,定义默认值,用正确语言的内容替换占位符,...)。因此,我创建了一个带有“占位符过滤器”的树枝扩展。此函数应获取正确的内容以替换占位符并处理附加功能。
因为内容类型是如此不同,所以对于每个包含在控制器中呈现内容的逻辑的内容类型,都有一些 - 让它称之为“插件”。
现在我的问题:
插件的控制器动作返回渲染的内容。因为我用树枝扩展中的内容替换占位符,所以我需要一种方法来调用此树枝扩展中的控制器操作。
到目前为止我的想法:
我知道我可以通过这种方式在模板中调用控制器动作(来源:http://symfony.com/doc/current/book/templating.html):
{{ render(controller(
'AppBundle:Article:recentArticles',
{ 'max': 3 }
)) }}
所以在 twig 中调用控制器动作似乎没有问题。但我需要在 twig-extension 中调用这个函数。
我还知道,当我将控制器实现为服务时,我可以调用控制器动作。但我不能将所有插件控制器都定义为服务,因为插件是动态包含在系统中的。在安装新插件时动态处理服务也将是“困难的”(我认为我必须使用脚本编辑 service.yml - 或者我错了吗?)。这就是为什么我不能将控制器用作服务。 - 但是当您告诉我如何动态实现服务时,我愿意接受其他解决方案。
我已经尝试过结合这两个页面的解决方案: http://symfony.com/doc/current/book/templating.html
echo $view['actions']->render(
new \Symfony\Component\HttpKernel\Controller\ControllerReference(
'AppBundle:Article:recentArticles',
array('max' => 3)
)
)
和https://www.robinvdvleuten.nl/blog/rendering-templates-in-a-twig-extension/
我现在可以在我的 twig-extension 的占位符过滤器中访问 Twig_Environment,但以下代码不起作用:
$twig->render( new \Symfony\Component\HttpKernel\Controller\ControllerReference(
'Extensions'.$namespace.'Bundle:Index:getContent',
array('content'=>$contentObject)
), array() );
我收到 ControllerReference 无法转换为字符串的错误(这是有道理的,因为 ControllerReference 是一个对象......)。
那么有没有办法在 twig-extension 中调用控制器操作而不将控制器定义为服务?还是我应该重新考虑整个解决方案?
【问题讨论】:
-
绝对重新考虑解决方案。 IMO,您应该制作侦听器或简单的服务来解析文本并返回预期的输出。此外,您应该制作某种缓存来存储该输出,而不是在每次请求时解析它。