当我在我的symfony2服务(twig扩展名)中注入security.context时,会出现以下错误:
在非对象上调用成员函数getUser().....
class GeninnoShareboardExtension extends \Twig_Extension {
public function __construct(ContainerInterface $container, SecurityContext $context) {
$this->doctrine = $container->get('doctrine');
$this->context = $context;
}
public function getUser() {
return $this->context->getToken()->getUser();
}
........
}
我的services.yml看起来像这样:
services:
geninno.twig.extension.dashboard:
class: Geninno\EDSBundle\Twig\Extension\GeninnoShareboardExtension
arguments:
container: "@service_container"
service: "@security.context"
tags:
- { name: twig.extension }
用户已登录,我的防火墙设置如下:
access_control:
- { path: ^/secured/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/secured/create, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: [IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED] }
答案 0 :(得分:2)
你应该试试
services:
geninno.twig.extension.dashboard:
class: Geninno\EDSBundle\Twig\Extension\GeninnoShareboardExtension
arguments: [@service_container, @security.context]
tags:
- { name: twig.extension }
答案 1 :(得分:1)
您在防火墙后面收到错误的页面吗?如果没有,那么它将无法访问安全令牌。您需要将页面放在防火墙后面,然后将其打开给未经身份验证的用户。
这样的事情应该可以解决未经身份验证的用户打开页面的问题,但仍然可以在防火墙内部(security.yml)
access_control:
- { path: /lost_password, roles: IS_AUTHENTICATED_ANONYMOUSLY}
答案 2 :(得分:1)
我通过向我的SecurityContext调用添加if来解决它。 检查GetToken()是否返回了对象(已验证的)或字符串(匿名)
if (is_object($this->context->getToken()))
{
.... // getUser() etc.
}