【发布时间】:2014-07-23 17:03:03
【问题描述】:
好的,我试图创建依赖于其他服务的树枝扩展 (security.context) 并遇到了一些麻烦。所以,这是我的服务声明:
acme.twig.user_extension:
class: Acme\BaseBundle\Twig\UserExtension
arguments: ["@security.context"]
tags:
- { name: twig.extension }
这是我的课
// acme/basebundle/twig/userextension.php
namespace Acme\BaseBundle\Twig;
use Symfony\Component\Security\Core\SecurityContext;
use Acme\UserBundle\Entity\User;
class UserExtension extends \Twig_Extension
{
protected $context;
public function __construct(SecurityContext $context){
$this->context = $context;
}
public function getFunctions()
{
return array(
'getAbcData' => new \Twig_SimpleFunction('getAbcData', $this->getAbcData()),
);
}
public function getAbcData()
{
if ( !is_object($user = $this->context->getToken()->getUser()) || !$user instanceof User){ return null; }
return array(
'data_array' => $user->getData(),
);
}
public function getName()
{
return 'user_extension';
}
}
最后,我有一个错误:
FatalErrorException: Error: Call to a member function getUser() on a non-object in \src\Acme\BaseBundle\Twig\UserExtension.php line 27
我猜 security.context 服务还没有初始化,然后我得到一个错误。 请问有没有办法手动加载服务,或者有什么更好的解决方案? 非常感谢。
我使用 Symfony 2.5.*
更新:
我也在 symfony 文档中找到了这个通知
请记住,Twig 扩展不会延迟加载。这意味着如果任何服务(或在这种情况下是您的 Twig 扩展)依赖于请求服务,您将更有可能获得 CircularReferenceException 或 ScopeWideningInjectionException。有关更多信息,请查看如何使用范围。 实际上,我不知道如何正确地做到这一点..
【问题讨论】:
标签: symfony service dependency-injection twig