在symfony中的Service类文件中获取会话问题

时间:2013-12-30 14:24:54

标签: php symfony

我正在使用symfony2并且在服务容器文件中我遇到了使用会话的问题。

这是我的服务文件:

public function FinalPrice()
{
    $session = $this->get('Currency');
    return  $session;
}

我在课程的顶部添加了响应和会话库:

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

我在symfony网站上发现它很容易使用它,没有任何问题

http://symfony.com/doc/current/book/service_container.html

其中说:

public function indexAction($bar)
{
    $session = $this->get('session');
    $session->set('foo', $bar);

    // ...
}

但是我收到了这个错误:

FatalErrorException: Error: Call to undefined method Doobin\CoreBundle\service\GeneralClass::get() in /var/www/doobin92/src/Doobin/CoreBundle/service/GeneralClass.php line 311

我也尝试过:

$session = $this->getRequest()->getSession();

但它给出了这个错误:

FatalErrorException: Error: Call to undefined method Doobin\CoreBundle\service\GeneralClass::getRequest() in /var/www/doobin92/src/Doobin/CoreBundle/service/GeneralClass.php line 311

感谢adcance

2 个答案:

答案 0 :(得分:2)

您尝试在此处使用的get()getRequest()帮助程序是Symfony2基本控制器的一部分。

一旦控制器扩展了上面显示的基本控制器,它们应该只在Controller上下文中使用。

如果您查看代码,您可能会注意到他们都使用container获取request_stack的{​​{1}}服务;

getRequest()

$this->container->get('request_stack')->getCurrentRequest(); 的任何其他服务,

get()

当您尝试在服务中调用这两种方法时。您在Controller上下文中 NOT ,并且您添加的服务类不提供此类帮助程序。

要解决此问题,

  1. 您必须通过$this->container->get($id); 注入您想要拨打的服务 帮助直接在您的服务中,或

  2. 通过添加

  3. 来注入容器
    get()

    到您的服务类,

    use Symfony\Component\DependencyInjection\ContainerInterface;
    
    public YourServiceClass
    {
        private $container;
    
        public function __construct(ContainerInterface $container)
        {
            $this->container = $container;
        }
    

    到您的服务定义。

答案 1 :(得分:2)

一种方法是将服务容器注入您的服务。

services:
    your_service:
        class:     YourClass
        arguments: ["@service_container"]

在您的服务类中:

use Symfony\Component\DependencyInjection\ContainerInterface  as Container;

YourClass {

    protected $container;

    public function __construct(Container $container) {
        $this->container = $container;
    }
}

然后,您可以在服务中使用$this->container->get('session');