我正在尝试从Symfony 2.1迁移到2.2.1版。我使用自己的选民来决定是否授予用户访问给定路线的权限。选民很简单,在更新之前就已经开始了。 问题是选民需求请求服务以获取检查用户是否可以访问站点所需的参数(它是路由中给出的一些id,例如/ profile / show / {userId})。 我总是检查请求范围是否处于活动状态以防止在使用CLI或PHPUnit时出错:
$this->request = null;
if ($container->isScopeActive('request')) {
$this->request = $container->get('request');
}
如果Vote方法中没有请求,则稍后抛出异常:
if ($this->request === null) {
throw new \RuntimeException("There's no request in ProfileVoter");
}
我在每次投票后都得到了这个例外(=在我的应用的每一页上)。
编辑:它只在开发环境中发生。
答案 0 :(得分:1)
根据Symfony2.2文档:
“请注意不要将请求存储在对象的属性中,以便将来调用该服务,因为它会导致第一部分中描述的相同问题(除了Symfony无法检测到您错了)。” (http://symfony.com/doc/current/cookbook/service_container/scopes.html#using-a-service-from-a-narrower-scope)
在您的解决方案中,检查构造函数中的容器范围活动,如果您有活动范围,请将其存储在$ this->请求中。 但是,正确的方法是存储不是请求,而是容器本身:
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
稍后,在您的方法中(如您所见,而不是在构造函数中),检查范围活动:
public function vote(...)
{
if ($this->container->isScopeActive('request')) {
$request = $this->container->get('request');
} else {
throw new \RuntimeException("There's no request in ProfileVoter");
}
}