Symfony2 + Twig - 在我自己的过滤器中使用TwigBundle的path()

时间:2012-07-31 21:06:31

标签: symfony twig

我正在尝试为我的项目创建一个Twig扩展。目标是使用jquery.cluetip插件生成用户弹出窗口,该插件可以在一个漂亮的工具提示中显示AJAX查询的结果。生成的HTML代码应如下所示:

<span class="userdata" rel="/profile/123/ajaxUserdata.html">W00d5t0ck</span>

目前,我的代码如下所示:

class UserDataSpanExtension extends \Twig_Extension
{                       
    protected $_securityContext;

    public function __construct(SecurityContextInterface $security)
    {
        $this->_securityContext = $security;
    }

    public function getFilters()
    {
        return array(
            'userdataspan' => new \Twig_Filter_Method($this, 'getUserDataSpan', array('is_safe' => array('html'))),
        );
    }

    public function getUserDataSpan(User $user)
    {
        if (!is_object($this->_securityContext->getToken()) || !is_object($this->_securityContext->getToken()->getUser()))
            return '<span class="userdata-secret" title="|User information|User information is available only to logged in users.">[not available]</span>';

        return '<span class="userdata" rel="">' . $user->getDisplayName() . '</span>';
    }

    public function getName()
    {
            return 'twig_userdataspan';
    }
}

现在我有点陷入困境,因为我不知道应该如何填写我的rel属性。在Twig模板中,我会使用

{{ path('AcmeDemoBundle_ajaxUserdata', { id: user.id }) }}

但这不适用于Twig扩展。有人能用一个可用的例子指出我吗?

1 个答案:

答案 0 :(得分:4)

在您的twig扩展服务中注入router并在您的方法中以常规方式生成网址,例如

$this->router->generate('AcmeDemoBundle_ajaxUserdata', array(
    'id' => $user->id,
));

将@router参数添加到services.yml中的扩展名:

services:
    demo.twig.extension:
        class: DemoBundle\Twig\Extension
        arguments: [@router]