【问题标题】:You have requested a non-existent service "security.context"您请求了一个不存在的服务“security.context”
【发布时间】:2016-04-10 15:44:50
【问题描述】:

我创建了服务,但它不起作用

services:
    redirectionListener:
          class: Front\EcommerceBundle\Listener\RedirectionListener
          arguments: ["@service_container","@session"]
          tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

这是我的课

namespace Front\EcommerceBundle\Listener;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class RedirectionListener
{
    public function __construct(ContainerBuilder $container, Session $session)
    {
        $this->session = $session;
        $this->router = $container->get('router');
        $this->securityContext = $container->get('security.context');
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $route = $event->getRequest()->attributes->get('_route');

        if ($route == 'livraison' || $route == 'validation') {
            if ($this->session->has('panier')) {
                if (count($this->session->get('panier')) == 0)
                    $event->setResponse(new RedirectResponse($this->router->generate('panier')));
            }

            if (!is_object($this->securityContext->getToken()->getUser())) {
                $this->session->getFlashBag()->add('notification','Vous devez vous identifier');
                $event->setResponse(new RedirectResponse($this->router->generate('fos_user_security_login')));
            }
        }
    }
}

Container.php 第 268 行中的 ServiceNotFoundException:您已请求 一个不存在的服务“security.context”。

【问题讨论】:

  • 一些不相关的建议:当您只需要路由器和 security.token_storage 时,无需注入整个容器。并且根本不注入会话,只需从请求中拉取它: $event=>getRequest()->getSession();

标签: php symfony fosuserbundle symfony-security


【解决方案1】:

security.context 服务在 2.6 中已弃用,并拆分为两个新服务:security.authorization_checkersecurity.token_storage

与之前版本框架的一些不同用法:

// Symfony 2.5
$user = $this->get('security.context')->getToken()->getUser();
// Symfony 2.6
$user = $this->get('security.token_storage')->getToken()->getUser();

// Symfony 2.5
if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) { ... }
// Symfony 2.6
if (false === $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { ... }

this公告中的更多信息

希望有帮助

【讨论】:

    【解决方案2】:

    以下示例将起作用:

    /*Symfony 4.1.3*/
    
    $user = $this->get('security.token_storage')->getToken()->getUser();
    
    echo $user->getId(); // USER ID SESSION
    

    【讨论】:

      猜你喜欢
      • 2013-02-03
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2016-12-29
      • 1970-01-01
      相关资源
      最近更新 更多