好的,我试图创建依赖于其他服务(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。*
UPD:
我也在symfony文档中找到了此通知
请记住,Twig Extensions不是延迟加载的。这意味着,如果有任何服务(或本例中的Twig扩展)依赖于请求服务,则您更有可能获得CircularReferenceException或ScopeWideningInjectionException。有关更多信息,请查看如何使用示波器。其实,我不知道该如何纠正。
您在构造Twig_SimpleFilter时正在调用 $this->getAbcData()
。但是您必须传递一个callable作为参数。
public function getFunctions() {
return array (
'getAbcData' => new \Twig_SimpleFunction( 'getAbcData', array( $this, 'getAbcData' ))
);
}
狮子座也是对的。getToken()
在尝试之前,您应该先检查是否正在返回对象getToken()->getUser()
。
您还可以在twig:中将用户作为参数传递给函数{{ getAbcData(app.user) }}
。这样,该功能更加通用,可以用于任何用户,而不仅仅是当前登录的用户。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句