"session.storage.factory.service"服务已被弃用。

9

我已将 Symfony 更新至 5.3,并获得了以下弃用日志:

用户弃用:自 symfony/framework-bundle 5.3 起:服务 session.storage.factory.service 已弃用,请使用 session.storage.factory.nativesession.storage.factory.php_bridge 或者 session.storage.factory.mock_file

我认为这是由使用 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

你是否考虑过遵循弃用信息中的建议? - Cerad
是的,我已经找到了。然而,我找不到决定使用 session.factory.session.storage.factory.service 服务的配置文件在哪里。 - Satoshi
config/packages/framework.yaml - Cerad
1个回答

27

您的 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 framework session会显示不同的结果。不确定是否出现了错误。

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


1
在我的情况下,将 storage_factory_id: session.storage.factory.native 添加到 framework.yaml 中,移除了我在分析器工具栏中遇到的 4 条弃用消息。感谢 @Cerad。 - Ali
在我的代码中,添加 storage_factory_id: session.storage.factory.native_file 会导致以下错误:You have requested a non-existent service "session.storage". - Yes Barry
实际上,当我尝试使用 bin/console debug:container session.storage.factory.native 进行调试时,它会显示:"session.storage.factory.native" 服务或别名已在容器编译时被删除或内联。 - Yes Barry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接