我有一个自定义的TemplatingProvider服务,我在控制器中使用它来输出视图。
namespace Acme\FrontEndBundle\Templating;
class TemplatingProvider
{
private $templating;
private $request;
function __construct($templating, $request)
{
$this->templating = $templating;
$this->request = $request;
}
function getTemplate($name)
{
$controller = $this->request->attributes->get('_controller');
preg_match('/Controller\\\([a-zA-Z]*)Controller/', $controller, $matches);
$controller = 'AcmeFrontEndBundle:' . $matches[1] . ':';
$template = $controller . $name;
// ...
在普通请求中,这可以正常工作,但不能在子请求上工作,例如在我使用twigs render(controller(...))
函数在模板中渲染控制器时。
似乎$this->request->attributes->get('_controller')
是NULL
。我理解为_route
,因为控制器不是通过一个访问的,但为什么_controller
没有设置,我怎么能绕过它?
我知道在树枝上使用render(path(...))
可以解决这个问题,但对我来说这不是一个选择,我真的需要render(controller(...))
。
提前感谢任何建议。
更新
感谢Vadim Ashikhmans的回答,我找到了解决方案:
将`@service_container
注入服务,然后使用容器获取请求,并在那里获得请求。但是我在辅助函数中解决了一个小障碍:
function getController()
{
$controller = $this->container->get('request')->get('_controller');
// on mainrequest (calling the controller through its route)
// $controller follows the namespacelike schema: Vendor\Bundle\Controller\ControllerController:actionAction
preg_match('/Controller\\\([a-zA-Z]*)Controller/', $controller, $matches);
if (isset($matches[1]))
{
$controller = 'AcmeFrontEndBundle:' . $matches[1] . ':';
}
else
{
// on subrequests (e.g. render(controller(...)) in a template)
// $controller looks like Bundle:Controller:action
preg_match('/:([a-zA-Z]*):/', $controller, $matches);
$controller = 'AcmeFrontEndBundle:' . $matches[1] . ':';
}
return $controller;
}
非常感谢你! :)
答案 0 :(得分:1)
我认为_controller
属性为空,因为对于每个子请求,当前请求对象都是重复的,因此在子请求中,TemplateProvider会尝试对旧数据进行操作。
您可以尝试将容器传递给TemplateProvider
构造函数,并在getTemplate
方法中检索请求对象。