如何从扩展中访问会话?

时间:2012-05-21 15:49:47

标签: symfony

如果您想从控制器访问会话,可以使用this->get('session');

但是它如何在扩展中起作用?

我尝试在services.xml中配置它并调整__construct($ session)方法:

<service id="myService" class="%myServie.class%">
    <argument type="service" id="session"/>
</service>

没用。 (空物体)

我尝试从请求中找到它:

$request = Request::createFromGlobals();
$session = $request->getSession();

没用。 (null object)

目前我正在为我的方法提供我在Controller中检索的会话,但我对这个解决方案不满意(我认为这是一个肮脏的解决方案)。

你如何以正确的方式做到这一点?

此致 Senad

1 个答案:

答案 0 :(得分:4)

您可以通过多种方式解决此问题。一种方法是使用整个框架中使用的依赖注入。

如果您将会话传递给扩展构造函数,则会将该会话“注入”该类。

示例代码

class MyService
{
    public function __construct($session)
    {
        // ...
    }
}


class MyController extends Controller
{
    public function exampleAction()
    {
        $myService = new MyService($this->get('session'));
    }
}

Symfony 2提供了一种自动注入此会话的方法。为此,您需要创建服务:

services.yml示例代码

services:
    myService:
        class: %myService.class%
        arguments: ["@session"]

然后在您的控制器中,您可以获得服务:

$myService = $this->get('myService');