"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 错误就会消失。
我已将 symfony 更新到 5.3 并获得类似
的弃用日志User Deprecated: Since symfony/framework-bundle 5.3: The
session.storage.factory.service
service is deprecated, usesession.storage.factory.native
,session.storage.factory.php_bridge
orsession.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 错误就会消失。