"session.storage.factory.service" 服务已弃用,

The "session.storage.factory.service" service is deprecated,

我已将 symfony 更新到 5.3 并获得类似

的弃用日志

User Deprecated: Since symfony/framework-bundle 5.3: The session.storage.factory.service service is deprecated, use session.storage.factory.native, session.storage.factory.php_bridge or session.storage.factory.mock_file instead.

我认为是使用TokenStrageInterface::getToken()引起的,但我找不到解决方法。

我用的代码是这样的

<?php


namespace App\EventSubscriber;


use App\Entity\User;
use Gedmo\Loggable\LoggableListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Http\Authenticator\Passport\PassportInterface;

class DoctrineExtensionSubscriber implements EventSubscriberInterface
{
    /**
     * @var LoggableListener
     */
    private LoggableListener $loggableListener;

    /**
     * @var TokenStorageInterface
     */
    private TokenStorageInterface $tokenStorage;

    public function __construct(LoggableListener      $loggableListener,
                                TokenStorageInterface $tokenStorage
    )
    {
        $this->loggableListener = $loggableListener;
        $this->tokenStorage = $tokenStorage;
    }


    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::CONTROLLER => [
                'onKernelController',
                -10,
            ],
        ];
    }

    public function onKernelController(ControllerEvent $event): void
    {
        if (!$event->isMainRequest()) {
            return;
        }
        if ($this->tokenStorage?->getToken()?->isAuthenticated() === true) {
            $user = $this->tokenStorage->getToken()->getUser();

            $controller = $event->getController();

            if (is_array($event->getController())) {
                $controller = $event->getController()[0];
            }

            if ($user instanceof User) {
                $this->loggableListener->setUsername($user->getFullName());
                return;
            }
            $this->loggableListener->setUsername('Anonymous');
        }
    }
}

我想过编辑配置文件,但我无法确定要更改的位置。 config/packages/framework.yaml请看以下代码:

# see https://symfony.com/doc/current/reference/configuration/framework.html
framework:
  secret: '%env(APP_SECRET)%'
  #csrf_protection: true
  #http_method_override: true

  # Enables session support. Note that the session will ONLY be started if you read or write from it.
  # Remove or comment this section to explicitly disable session support.
  session:
    #handler_id: null
    cookie_secure: auto
    cookie_samesite: lax
    save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'

  #esi: true
  #fragments: true
  php_errors:
    log: true

您的 framework.yaml 会话部分应如下所示:

    session:
        handler_id: null
        cookie_secure: auto
        cookie_samesite: lax
        storage_factory_id: session.storage.factory.native

这是您使用新的 5.3 项目获得的默认配置。如果需要,您可以保留 save_path 条目。 storage_value_id 是在 5.3 中引入的。

根据 storage_factory_id 文档,默认值应该已经是 factory.native。这意味着您实际上根本不需要该条目。

但是,bin/console debug:config 框架会话如果您将其省略,会显示不同的结果。不确定是不是错误。

无论如何,添加 storage_factory_id 错误就会消失。