Php Symfony2会话正在使用中

Php Symfony2会话正在使用中,php,symfony,session,Php,Symfony,Session,我对Symfony2会话有问题 我试图创建一个在每个控制器顶部执行的服务。 此服务的目的是对用户进行身份验证 我首先检查会话,看看是否有“auth”密钥。 如果没有,我检查是否有饼干 问题在于访问服务中的用户会话。 我已经将Request对象传递给我的服务参数,并使用$Request->getSession()获取会话。 一切似乎都正常,但会话中没有存储任何数据 我很确定问题来自我在服务中获取会话的方式。但是,我不知道我怎样才能用另一种方式来做 有人能帮我吗 这是我的服务.yml文件: serv

我对Symfony2会话有问题

我试图创建一个在每个控制器顶部执行的服务。 此服务的目的是对用户进行身份验证

我首先检查会话,看看是否有“auth”密钥。 如果没有,我检查是否有饼干

问题在于访问服务中的用户会话。 我已经将Request对象传递给我的服务参数,并使用
$Request->getSession()获取会话。
一切似乎都正常,但会话中没有存储任何数据

我很确定问题来自我在服务中获取会话的方式。但是,我不知道我怎样才能用另一种方式来做

有人能帮我吗

这是我的服务.yml文件:

services:
    myBundle.authService:
        class: MyCompany\MyBundle\Services\AuthService
        scope: request
        arguments:
            request: @request
            logger: @logger
            em: @doctrine.orm.entity_manager
这是我的AuthService课程:

namespace MyCompany\MyBundle\Services;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

use Doctrine\ORM\EntityManager;
use Monolog\Logger;

use MyCompany\MyBundle\Entity\User;
use MyCompany\MyBundle\Entity\Session;

class AuthService
{
    private $_request;
    private $_logger;
    private $_em;
    private $_session;

    public function __construct(Request $request, Logger $logger, EntityManager $em)
    {
        $this->_request = $request;
        $this->_logger = $logger;
        $this->_em = $em;
        $this->_session = $this->_request->getSession();
        $this->_session->start();

        $this->_fUser = null;

        $encoders = array(new XmlEncoder(), new JsonEncoder());
        $normalizers = array(new GetSetMethodNormalizer());

        $this->_serializer = new Serializer($normalizers, $encoders);
    }

    // THIS FUNCTION IS CALLED IN CONTROLLER
    public function checkAuth()
    {
        $_return = false;

        if($this->checkSession())
        {
            $_return = true;
        }
        else
        {
            $userCookie = $this->checkCookie();
            if($userCookie)
            {
                if(is_array($userCookie) && array_key_exists('token', $userCookie) && array_key_exists('value', $userCookie))
                {
                    $fUser = $this->findUserBySession($userCookie['token'], $userCookie['value']);
                    if($fUser)
                    {
                        $_return = $this->updateSession($fUser);
                    }
                }
            }
        }

        return $_return;
    }

    // CHECK IF SESSION HAS 'FUSER' KEY AND 'AUTH' KEY
    private function checkSession()
    {
        $_return = false;

        if($this->_session && $this->_session->has("FUSER") && $this->_session->has("AUTH") && preg_match("/[0-9a-zA-Z]{58}/", $this->_session->get("AUTH")) === true)
        {
            // I NEVER GO HERE
            $this->_logger->info("OK \o/");
            $_return = $this->_session->get('FUSER');
        }

        return $_return;
    }

    // CHECK IF AUTH COOKIE IS SET
    private function checkCookie()
    {
        $_return = false;

        $cookies = $this->_request->cookies;
        if($cookies && count($cookies) > 0)
        {
            foreach($cookies as $key => $val)
            {               
                if(preg_match("/[0-9a-zA-Z]{58}/", $key) && preg_match("/[0-9a-zA-Z]{58}/", $val))
                {
                    $_return = array('token' => $key, 'value' => $val);
                }
            }
        }

        return $_return;
    }

    // FIND SESSION IN DB AND USER ASSOCIATED
    private function findUserBySession($token, $value)
    {
        $_return = false;

        $fSessionRepository = $this->_em->getRepository("MyCompanyBundle:FSession");
        if($fSessionRepository)
        {
            $fSession = $fSessionRepository->findOneBy(array('token' => $value));
            if($fSession)
            {
                $fUser = $fSession->getUser();
                if($fUser)
                {                    
                    if($fUser->getToken() === $token)
                    {
                        $_return = $fUser;
                    }
                }
            }
        }

        return $_return;
    }

    // UPDATE SESSION TO REGISTER 'USER' AND 'AUTH' KEYS
    public function updateSession(User $fUser)
    {
        $_return = false;

        if($this->_session)
        {
            $this->_session->set('FUSER', $this->serialize($fUser, 'json'));
            $this->_session->set('AUTH', User::generateToken());

            // THIS WORKS FINE
            $this->_logger->info("OK !!! _o/");

            $_return = $this->serialize($fUser, 'json');
        }

        return $_return;
    }

    // SERIALIZE OBJECT
    public function serialize($JSONObject, $format)
    {
        return $this->_serializer->serialize($JSONObject, $format);
    }

    // DESERIALIZE OBJECT
    public function deserialize($JSONObject, $entity, $format)
    {
        return $this->_serializer->deserialize($JSONObject, $entity, $format);
    }
}

提前感谢您的时间和帮助。

您是否尝试使用“@session”而不是@request?是的,我已尝试在我的服务中添加@session.yml。但结果是一样的。我真的不明白您是否知道Symfony2附带了一个非常非常好而且功能强大的身份验证和授权系统?你为什么要自己建造这个?是的,我读过很多关于它的东西。但是我不明白它=/我试过你的代码,它是有效的。从Symfony 2.4开始,最好的做法是注入请求\u堆栈而不是请求。看,我鼓励你使用。这是用户身份验证的事实标准,可以与OAuth日志集成。