E60C Deprecat service "session" · symfony/symfony@6ccd212 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6ccd212

Browse files
committed
Deprecat service "session"
1 parent fdf9a43 commit 6ccd212

File tree

13 files changed

+183
-47
lines changed

13 files changed

+183
-47
lines changed

src/Symfony/Bundle/FrameworkBundle/Controller/AbstractController.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ public static function getSubscribedServices()
9292
'request_stack' => '?'.RequestStack::class,
9393
'http_kernel' => '?'.HttpKernelInterface::class,
9494
'serializer' => '?'.SerializerInterface::class,
95-
'session' => '?'.SessionInterface::class,
9695
'security.authorization_checker' => '?'.AuthorizationCheckerInterface::class,
9796
'twig' => '?'.Environment::class,
9897
'doctrine' => '?'.ManagerRegistry::class,
@@ -199,11 +198,11 @@ protected function file($file, string $fileName = null, string $disposition = Re
199198
*/
200199
protected function addFlash(string $type, $message): void
201200
{
202-
if (!$this->container->has('session')) {
201+
if (null === $session = $this->container->get('request_stack')->getSession()) {
203202
throw new \LogicException('You can not use the addFlash method if sessions are disabled. Enable them in "config/packages/framework.yaml".');
204203
}
205204

206-
$this->container->get('session')->getFlashBag()->add($type, $message);
205+
$session->getFlashBag()->add($type, $message);
207206
}
208207

209208
/**

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/SessionPass.php

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,51 @@ class SessionPass implements CompilerPassInterface
2222
{
2323
public function process(ContainerBuilder $container)
2424
{
25-
if (!$container->hasDefinition('session')) {
25+
if (!$container->has('session.storage')) {
2626
return;
2727
}
2828

29-
$bags = [
30-
'session.flash_bag' => $container->hasDefinition('session.flash_bag') ? $container->getDefinition('session.flash_bag') : null,
31-
'session.attribute_bag' => $container->hasDefinition('session.attribute_bag') ? $container->getDefinition('session.attribute_bag') : null,
32-
];
29+
// if the session is not override, use SessionFactoryListener instead of SessionListener
30+
$args = $container->getDefinition('session')->getArguments();
31+
if (
32+
$args[0] instanceof Reference && 'session.storage' === (string) $args[0]
33+
&& null === $args[1]
34+
&& null === $args[2]
35+
&& is_array($args[3]) && $args[3][1] === 'onSessionUsage' && $args[3][0] instanceof Reference && 'session_listener' === (string) $args[3][0]
36+
) {
37+
$container->removeDefinition('session_listener');
38+
$container->getDefinition('session')->setArgument(3, null);
3339

34-
foreach ($container->getDefinition('session')->getArguments() as $v) {
35-
if (!$v instanceof Reference || !isset($bags[$bag = (string) $v]) || !\is_array($factory = $bags[$bag]->getFactory())) {
36-
continue;
37-
}
40+
$locator = $container->getDefinition('session_factory_listener')->getArgument(0);
41+
$locator->setValues($locator->getValues() + [
42+
'session.flash_bag' => $container->hasDefinition('session.flash_bag') ? $container->getDefinition('session.flash_bag') : null,
43+
'session.attribute_bag' => $container->hasDefinition('session.attribute_bag') ? $container->getDefinition('session.attribute_bag') : null,
44+
]);
45+
} else {
46+
$container->removeDefinition('session_factory_listener');
47+
$definition = $container->getDefinition('session');
3848

39-
if ([0, 1] !== array_keys($factory) || !$factory[0] instanceof Reference || 'session' !== (string) $factory[0]) {
40-
continue;
41-
}
49+
$bags = [
50+
'session.flash_bag' => $container->hasDefinition('session.flash_bag') ? $container->getDefinition('session.flash_bag') : null,
51+
'session.attribute_bag' => $container->hasDefinition('session.attribute_bag') ? $container->getDefinition('session.attribute_bag') : null,
52+
];
4253

43-
if ('get'.ucfirst(substr($bag, 8, -4)).'Bag' !== $factory[1]) {
44-
continue;
45-
}
54+
foreach ($definition->getArguments() as $v) {
55+
if (!$v instanceof Reference || !isset($bags[$bag = (string) $v]) || !\is_array($factory = $bags[$bag]->getFactory())) {
56+
continue;
57+
}
58+
59+
if ([0, 1] !== array_keys($factory) || !$factory[0] instanceof Reference || 'session' !== (string) $factory[0]) {
60+
continue;
61+
}
4662

47-
$bags[$bag]->setFactory(null);
63+
if ('get'.ucfirst(substr($bag, 8, -4)).'Bag' !== $factory[1]) {
64+
continue;
65+
}
66+
67+
$bags[$bag]->setFactory(null);
68+
}
4869
}
70+
4971
}
5072
}

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,11 @@ private function registerSessionConfiguration(array $config, ContainerBuilder $c
10051005
'session_storage' => new Reference('session.storage', ContainerInterface::IGNORE_ON_INVALID_REFERENCE),
10061006
'request_stack' => new Reference('request_stack'),
10071007
]);
1008+
1009+
$locator = $container->getDefinition('session_factory_listener')->getArgument(0);
1010+
$locator->setValues($locator->getValues() + [
1011+
'request_stack' => new Reference('request_stack'),
1012+
]);
10081013
}
10091014

10101015
$container->setParameter('session.storage.options', $options);

src/Symfony/Bundle/FrameworkBundle/KernelBrowser.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public function loginUser($user, string $firewallContext = 'main'): self
122122

123123
$token = new TestBrowserToken($user->getRoles(), $user);
124124
$token->setAuthenticated(true);
125-
$session = $this->getContainer()->get('session');
125+
$session = $this->getContainer()->get('request_stack')->getSession();
126126
$session->set('_security_'.$firewallContext, serialize($token));
127127
$session->save();
128128

src/Symfony/Bundle/FrameworkBundle/Resources/config/security_csrf.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
->alias(TokenGeneratorInterface::class, 'security.csrf.token_generator')
2828

2929
->set('security.csrf.token_storage', SessionTokenStorage::class)
30-
->args([service('session')])
30+
->args([service('request_stack')])
3131

3232
->alias(TokenStorageInterface::class, 'security.csrf.token_storage')
3333

src/Symfony/Bundle/FrameworkBundle/Resources/config/session.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
2828
use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;
2929
use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface;
30+
use Symfony\Component\HttpKernel\EventListener\FactorySessionListener;
3031
use Symfony\Component\HttpKernel\EventListener\SessionListener;
3132

3233
return static function (ContainerConfigurator $container) {
@@ -41,7 +42,9 @@
4142
null, // FlashBagInterface
4243
[service('session_listener'), 'onSessionUsage'],
4344
])
45+
->deprecate('symfony/framework-bundle', '5.3', 'The "%service_id%" service is deprecated, use "$requestStack->getSession()" instead.')
4446
->alias(SessionInterface::class, 'session')
47+
->deprecate('symfony/framework-bundle', '5.3', 'The "%alias_id%" alias is deprecated, use "$requestStack->getSession()" instead.')
4548
->alias(SessionStorageInterface::class, 'session.storage')
4649
->alias(\SessionHandlerInterface::class, 'session.handler')
4750

@@ -91,6 +94,18 @@
9194
->factory([SessionHandlerFactory::class, 'createHandler'])
9295
->args([abstract_arg('A string or a connection object')])
9396

97+
->set('session_factory_listener', FactorySessionListener::class)
98+
->args([
99+
service_locator([
100+
'session.storage' => service('session.storage')->ignoreOnInvalid(),
101+
'logger' => service('logger')->ignoreOnInvalid(),
102+
'session_collector' => service('data_collector.request.session_collector')->ignoreOnInvalid(),
103+
'session.flash_bag' => service('session.flash_bag')->ignoreOnInvalid(),
104+
'session.attribute_bag' => service('session.attribute_bag')->ignoreOnInvalid(),
105+
]),
106+
param('kernel.debug'),
107+
])
108+
->tag('kernel.event_subscriber')
94109
->set('session_listener', SessionListener::class)
95110
->args([
96111
service_locator([

src/Symfony/Bundle/SecurityBundle/DependencyInjection/Compiler/RegisterTokenUsageTrackingPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public function process(ContainerBuilder $container)
4141
TokenStorageInterface::class => new BoundArgument(new Reference('security.untracked_token_storage'), false),
4242
]);
4343

44-
if (!$container->has('session')) {
44+
if (!$container->has('session.storage')) {
4545
$container->setAlias('security.token_storage', 'security.untracked_token_storage')->setPublic(true);
4646
$container->getDefinition('security.untracked_token_storage')->addTag('kernel.reset', ['method' => 'reset']);
4747
} elseif ($container->hasDefinition('security.context_listener')) {

src/Symfony/Bundle/SecurityBundle/Resources/config/security.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
->args([
7575
service('security.untracked_token_storage'),
7676
service_locator([
77-
'session' => service('session'),
77+
'request_stack' => service('request_stack'),
7878
]),
7979
])
8080
->tag('kernel.reset', ['method' => 'disableUsageTracking'])

src/Symfony/Component/HttpFoundation/RequestStack.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\HttpFoundation;
1313

14+
use Symfony\Component\HttpFoundation\Session\SessionInterface;
15+
1416
/**
1517
* Request stack that controls the lifecycle of requests.
1618
*
@@ -100,4 +102,18 @@ public function getParentRequest()
100102

101103
return $this->requests[$pos];
102104
}
105+
106+
/**
107+
* Gets the current session.
108+
*
109+
* @return SessionInterface|null
110+
*/
111+
public function getSession(): ?SessionInterface
112+
{
113+
if (null === $request = end($this->requests) ?: null) {
114+
return null;
115+
}
116+
117+
return $request->hasSession() ? $request->getSession() : null;
118+
}
103119
}

src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ public function onKernelRequest(RequestEvent $event)
6161
if ($request->hasSession()) {
6262
// no-op
6363
} elseif (method_exists($request, 'setSessionFactory')) {
64-
$request->setSessionFactory(function () { return $this->getSession(); });
64+
$sess = null;
65+
$request->setSessionFactory(function () use (&$sess) {
66+
return $sess ?? $sess = $this->getSession();
67+
});
6568
} elseif ($session = $this->getSession()) {
6669
$request->setSession($session);
6770
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\HttpKernel\EventListener;
13+
14+
use Psr\Container\ContainerInterface;
15+
use Symfony\Component\HttpFoundation\Session\Session;
16+
use Symfony\Component\HttpFoundation\Session\SessionInterface;
17+
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
18+
19+
/**
20+
* Sets the new built session in the request.
21+
*
22+
* When the passed container contains a "request_stack" entry and a
23+
* "session.storage" which olds a NativeSessionStorage instance, the
24+
* "cookie_secure" option will be set to true whenever the current
25+
* master request is secure.
26+
*
27+
* @author Fabien Potencier <fabien@symfony.com>
28+
* @author Jérémy Derussé <jeremy@derusse.com>
29+
*/
30+
final class FactorySessionListener extends AbstractSessionListener
31+
{
32+
public function __construct(ContainerInterface $container, bool $debug = false)
33+
{
34+
parent::__construct($container, $debug);
35+
}
36+
37+
protected function getSession(): ?SessionInterface
38+
{
39+
if (!$this->container->has('session.storage')) {
40+
return null;
41+
}
42+
$storage = $this->container->get('session.storage');
43+
44+
if ($storage instanceof NativeSessionStorage
45+
&& $this->container->has('request_stack')
46+
&& ($masterRequest = $this->container->get('request_stack')->getMasterRequest())
47+
&& $masterRequest->isSecure()
48+
) {
49+
$storage->setOptions(['cookie_secure' => true]);
50+
}
51+
52+
return new Session(
53+
$storage,
54+
null,
55+
null,
56+
[$this, 'onSessionUsage']
57+
);
58+
}
59+
}

src/Symfony/Component/Security/Core/Authentication/Token/Storage/UsageTrackingTokenStorage.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Security\Core\Authentication\Token\Storage;
1313

1414
use Psr\Container\ContainerInterface;
15+
use Symfony\Component\HttpFoundation\RequestStack;
1516
use Symfony\Component\HttpFoundation\Session\SessionInterface;
1617
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
1718
use Symfony\Contracts\Service\ServiceSubscriberInterface;
@@ -40,7 +41,7 @@ public function getToken(): ?TokenInterface
4041
{
4142
if ($this->enableUsageTracking) {
4243
// increments the internal session usage index
43-
$this->sessionLocator->get('session')->getMetadataBag();
44+
$this->sessionLocator->get('request_stack')->getSession()->getMetadataBag();
4445
}
4546

4647
return $this->storage->getToken();
@@ -55,7 +56,7 @@ public function setToken(TokenInterface $token = null): void
5556

5657
if ($token && $this->enableUsageTracking) {
5758
// increments the internal session usage index
58-
$this->sessionLocator->get('session')->getMetadataBag();
59+
$this->sessionLocator->get('request_stack')->getSession()->getMetadataBag();
5960
}
6061
}
6162

@@ -72,7 +73,7 @@ public function disableUsageTracking(): void
7273
public static function getSubscribedServices(): array
7374
{
7475
return [
75-
'session' => SessionInterface::class,
76+
'request_stack' => RequestStack::class,
7677
];
7778
}
7879
}

0 commit comments

Comments
 (0)
0