-
-
Notifications
You must be signed in to change notification settings - Fork 9.8k
Description
Symfony version(s) affected
6.1.*
Description
The change made within #45476 causes the RequestStack to be empty when the StreamedResponse Callback is being called.
In detail:
When using an StreamedResponse, the Callback passed to StreamedResponse is executed AFTER the \Symfony\Component\HttpKernel\Kernel::handle method (which is doing a pop on the RequestStack in \Symfony\Component\HttpKernel\HttpKernel::finishRequest).
Instead it is executed within the \Symfony\Component\HttpFoundation\Response::send method causing the \Symfony\Component\HttpFoundation\RequestStack to be empty and not having any Request object inside it.
We're upgrading our legacy application which is already wrapped with symfony.
This is why we're sadly have to use a construct where we're required to inject the \Symfony\Component\HttpFoundation\RequestStack to get the Request which is not available anymore at that state within a StreamedResponse.
Is this really the expected / wanted behaviour for this change? That when using a StreamedResponse the Request object becomes unavailable or is required to be reinitialized manually? If this is desired it should be announced as a possible BC break.
How to reproduce
./src/Service/TestService.php
<?php
namespace App\Service;
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
#[Autoconfigure(public: true)]
class TestService
{
public function __construct(private readonly RequestStack $requestStack)
{
}
public function getRequest(): Request
{
return $this->requestStack->getMainRequest();
}
}./src/Controller/TestController.php
<?php
namespace App\Controller;
use App\Kernel;
use App\Service\TestService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpKernel\Attribute\AsController;
use Symfony\Component\Routing\Annotation\Route;
#[AsController]
class TestController extends AbstractController
{
#[Route('/')]
public function test(Kernel $kernel): StreamedResponse
{
return new StreamedResponse(function () use ($kernel) {
/** @var TestService $testService */
$testService = $kernel->getContainer()->get(TestService::class);
$mainRequest = $testService->getRequest();
echo $mainRequest->server->get('HTTP_HOST');
});
}
}When calling the /test url an exception is thrown:
Return value must be of type Symfony\Component\HttpFoundation\Request, null returned
Possible Solution
No response
Additional Context
Behaviour was changed in pull request: #45476