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
Symfony SessionInterface as service与Request getSession()相同_Symfony_Session_Service - Fatal编程技术网

Symfony SessionInterface as service与Request getSession()相同

Symfony SessionInterface as service与Request getSession()相同,symfony,session,service,Symfony,Session,Service,Symfony的会话界面对我来说仍然有点模糊/神奇。所以,如果有人能启发我,请 当然,请求包含一个会话对象,可以在控制器中使用 类SimpleControl扩展了AbstractController { 公共功能索引(请求$Request):响应 { $request->getSession()->set('session-var',10); } } 但是,在一个服务中,您还可以将SessionInterface作为一个服务包括在内,并使用相同的ParameterBag 类SimpleServ

Symfony的会话界面对我来说仍然有点模糊/神奇。所以,如果有人能启发我,请

当然,请求包含一个会话对象,可以在控制器中使用

类SimpleControl扩展了AbstractController
{
公共功能索引(请求$Request):响应
{
$request->getSession()->set('session-var',10);
}
}
但是,在一个服务中,您还可以将SessionInterface作为一个服务包括在内,并使用相同的ParameterBag

类SimpleService
{
公共函数构造(SessionInterface$session)
{
$session->set('session-var',10);
}
}
我的同事指出,会议是(而且应该始终是)请求的一部分。这对我来说很有意义,但也让我思考:当SessionInterface是请求的对象/属性时,为什么您能够将它作为服务提供给我们


我最终想要实现的是在我的控制器中包含一个服务,并在该服务中与当前会话一起工作

我的用例的代码示例如下所示

类SimpleControl扩展了AbstractController
{
私人$simpleService;
公共函数构造(SimpleService$SimpleService)
{
$this->simpleService=$simpleService;
}
公共功能索引(请求$Request):响应
{
$this->simpleService->doSomething();
}
}
类SimpleService
{
非公开会议;
公共函数构造(SessionInterface$session)
{
$this->session=$session;
}
公共函数doSomething()
{
//做一些事情…并将结果保存在会话中。
$this->session->set('just_a_preference',50);
}
}
因此:

  • 在Symfony中,这是/正确的会话处理方式吗
  • “just_a_preference”是否保存在与我的$request->getSession()相同的会话参数包中
  • 如果不是,那么在控制器外部处理当前请求会话的正确方法是什么
  • 如果使用Symfony 4.4

  • 两种方法都很好。它们都引用同一个对象。不过,最好通过接口访问会话。我至少可以提出三个理由:

  • 扩展功能:接口后面的服务可以很容易地进行修饰–例如,
    LoggingSessionDecorator
    ,它将记录会话活动
  • 正确的OOP代码:使用
    $request->getSession()->set(…)
    您违反了原则,即:
  • 在单元测试中模拟会话更容易
  • 最后——是的,没关系。两个方法都引用同一个对象

  • 如1所述,最好使用接口。至少在我看来是这样