symfony5服务-如何在没有ContainerInterface的情况下注入会话和用户



我有一条弃用消息:

由于symfony/依赖项注入5.1:"Symfony\Component\DependencyInjection\ContainerInterface"自动装配别名已弃用。如果你想在应用程序中明确定义它继续使用。

从Symfony这样的线程:在服务中显式定义容器我知道长期的解决方案是停止在我的服务中一起使用ContainerInterface。

我的服务。yaml看起来是这样的:

parameters:
#locale: en
basepath: '%env(basepath)%'
services:
# default configuration for services in *this* file
_defaults:
autowire: true      # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
# controllers are imported separately to make sure services can be injected
# as action arguments even if you don't extend any base controller class
AppController:
resource: '../src/Controller/'
tags: ['controller.service_arguments']

# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
globalHelper:
class: AppServiceglobalHelper
public: false

有问题的服务(globalHelper(如下所示:

<?php
namespace AppService;
use SymfonyComponentDependencyInjectionContainerInterface as Container;
use DoctrineORMEntityManagerInterface as EntityManager;
class globalHelper {
private $container;
private $em;
public function __construct(Container $container, EntityManager $em) {
$this->container = $container;
$this->em = $em;
}

我只使用容器来获取像这样的会话变量

$this->container->get('session')->getFlashBag()->add($type, $message);

为了获得像这样的当前用户(安全上下文(

$this->container->get('security.context')->getToken()->getUser();

我可以单独获取容器的这些子组件吗?然后,我将注入哪个组件来分别访问这两个部分(会话和用户(?

---------------添加---------------

根据Alexis在下面的建议,我用修改了文件的标题

<?php
namespace AppService;
//use SymfonyComponentDependencyInjectionContainerInterface as Container;
use SymfonyComponentHttpFoundationRequestStack;
use SymfonyComponentSecurityCoreSecurity;
use DoctrineORMEntityManagerInterface as EntityManager;
class globalHelper {
//private $container;
private $requestStack;
private $security;
private $em;
//public function __construct(Container $container, RequestStack $requestStack, Security $security, EntityManager $em) {
public function __construct(RequestStack $requestStack, Security $security, EntityManager $em) {
//$this->container = $container;
$this->requestStack = $requestStack;
$this->security = $security;
$this->em = $em;
}

然后更换

$this->container->get('session')->getFlashBag()->add($type, $message);

带有

$this->requestStack->getSession()->getFlashBag()->add($type, $message);

并得到这个错误:

试图调用名为"的未定义方法;getSession"的"Symfony\Component\HttpFoundation\RequestStack"。

如果我改为这个:

$this->requestStack->get('session')->getFlashBag()->add($type, $message);

试图调用名为"的未定义方法;得到";的"Symfony\Component\HttpFoundation\RequestStack"。你想打电话吗例如";getCurrentRequest"getMasterRequest";或";getParentRequest"?

首先,声明的服务帮助不是强制性的

autoconfigure: true

然后你必须注入

SymfonyComponentHttpFoundationRequestStack

并制作

$requestStack->getSession()

这是的文档

https://symfony.com/doc/current/session.html

为用户注入

SymfonyComponentSecurityCoreSecurity

并制作

$security->getUser()

这是的文档

https://symfony.com/doc/current/security.html#fetching-来自服务的用户

--编辑--

Prio symfony 5.3会话可以直接注入

SymfonyComponentHttpFoundationSessionSessionInterface

之后贬值。这是一篇博客文章:

https://symfony.com/blog/new-in-symfony-5-3-session-service-deprecation

使用symfony 6.2,您也可以将其添加到service.yml:上

SymfonyComponentHttpFoundationSessionSessionInterface:
factory: "@=service('request_stack').getCurrentRequest()?.getSession()"

可以返回null

相关内容

最新更新