Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 2.2-投票者中没有请求范围_Php_Symfony_Symfony 2.2 - Fatal编程技术网

Php Symfony 2.2-投票者中没有请求范围

Php Symfony 2.2-投票者中没有请求范围,php,symfony,symfony-2.2,Php,Symfony,Symfony 2.2,我正在尝试从Symfony 2.1迁移到2.2.1版。我使用自己的投票者来决定是否允许用户访问给定的路由。选民真的很简单,它的工作之前的更新。 问题是投票者需要请求服务来获取检查用户是否可以访问站点所需的参数(这是路由中给定的某个id,例如/profile/show/{userId})。 我总是检查请求作用域是否处于活动状态,以防止在使用CLI或PHPUnit时出错: $this->request = null; if ($container->isScopeActive('requ

我正在尝试从Symfony 2.1迁移到2.2.1版。我使用自己的投票者来决定是否允许用户访问给定的路由。选民真的很简单,它的工作之前的更新。 问题是投票者需要请求服务来获取检查用户是否可以访问站点所需的参数(这是路由中给定的某个id,例如/profile/show/{userId})。 我总是检查请求作用域是否处于活动状态,以防止在使用CLI或PHPUnit时出错:

$this->request = null;
if ($container->isScopeActive('request')) {
  $this->request = $container->get('request');
}
如果投票方法中没有请求,则稍后抛出异常:

if ($this->request === null) {
  throw new \RuntimeException("There's no request in ProfileVoter");
}
每次投票后我都会遇到这个例外


编辑:仅在开发环境中发生。

根据Symfony2.2文档:

“注意不要将请求存储在对象的属性中,以便将来调用该服务,因为这将导致与第一节中描述的问题相同的问题(除了Symfony无法检测到您的错误)。”()

在解决方案中,检查构造函数中的容器作用域活动,如果有活动作用域,则将其存储在$this->request中。 但是,正确的方法不是存储请求,而是存储容器本身:

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");
    }
}

你确定你在请求范围内吗?另请参见:我确定我不在请求范围内(这就是我得到异常的原因),但我不知道为什么。我不能在投票服务定义中使用scope=request,因为我认为安全服务不使用这个作用域。在更新Symfony及其依赖项后,我没有做任何更改。您阅读了链接吗?它讨论了三种修复方法,其中一种应该有效是的,我读过;)它说:服务不能依赖于范围更窄的服务。所以我不能更改投票人的作用域,因为“security.access.decision\u manager.delegate”引用了它。当我这样做时,我得到ScopeWidenginInjectionException。只需向下滚动一点并阅读:“使用来自更窄范围的服务¨”