You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.1 KiB
128 lines
3.1 KiB
<?php |
|
|
|
/* |
|
* This file is part of the Symfony package. |
|
* |
|
* (c) Fabien Potencier <fabien@symfony.com> |
|
* |
|
* For the full copyright and license information, please view the LICENSE |
|
* file that was distributed with this source code. |
|
*/ |
|
|
|
namespace Symfony\Component\HttpFoundation; |
|
|
|
use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException; |
|
use Symfony\Component\HttpFoundation\Session\SessionInterface; |
|
|
|
/** |
|
* Request stack that controls the lifecycle of requests. |
|
* |
|
* @author Benjamin Eberlei <kontakt@beberlei.de> |
|
*/ |
|
class RequestStack |
|
{ |
|
/** |
|
* @var Request[] |
|
*/ |
|
private $requests = []; |
|
|
|
/** |
|
* Pushes a Request on the stack. |
|
* |
|
* This method should generally not be called directly as the stack |
|
* management should be taken care of by the application itself. |
|
*/ |
|
public function push(Request $request) |
|
{ |
|
$this->requests[] = $request; |
|
} |
|
|
|
/** |
|
* Pops the current request from the stack. |
|
* |
|
* This operation lets the current request go out of scope. |
|
* |
|
* This method should generally not be called directly as the stack |
|
* management should be taken care of by the application itself. |
|
* |
|
* @return Request|null |
|
*/ |
|
public function pop() |
|
{ |
|
if (!$this->requests) { |
|
return null; |
|
} |
|
|
|
return array_pop($this->requests); |
|
} |
|
|
|
/** |
|
* @return Request|null |
|
*/ |
|
public function getCurrentRequest() |
|
{ |
|
return end($this->requests) ?: null; |
|
} |
|
|
|
/** |
|
* Gets the main request. |
|
* |
|
* Be warned that making your code aware of the main request |
|
* might make it un-compatible with other features of your framework |
|
* like ESI support. |
|
*/ |
|
public function getMainRequest(): ?Request |
|
{ |
|
if (!$this->requests) { |
|
return null; |
|
} |
|
|
|
return $this->requests[0]; |
|
} |
|
|
|
/** |
|
* Gets the master request. |
|
* |
|
* @return Request|null |
|
* |
|
* @deprecated since symfony/http-foundation 5.3, use getMainRequest() instead |
|
*/ |
|
public function getMasterRequest() |
|
{ |
|
trigger_deprecation('symfony/http-foundation', '5.3', '"%s()" is deprecated, use "getMainRequest()" instead.', __METHOD__); |
|
|
|
return $this->getMainRequest(); |
|
} |
|
|
|
/** |
|
* Returns the parent request of the current. |
|
* |
|
* Be warned that making your code aware of the parent request |
|
* might make it un-compatible with other features of your framework |
|
* like ESI support. |
|
* |
|
* If current Request is the main request, it returns null. |
|
* |
|
* @return Request|null |
|
*/ |
|
public function getParentRequest() |
|
{ |
|
$pos = \count($this->requests) - 2; |
|
|
|
return $this->requests[$pos] ?? null; |
|
} |
|
|
|
/** |
|
* Gets the current session. |
|
* |
|
* @throws SessionNotFoundException |
|
*/ |
|
public function getSession(): SessionInterface |
|
{ |
|
if ((null !== $request = end($this->requests) ?: null) && $request->hasSession()) { |
|
return $request->getSession(); |
|
} |
|
|
|
throw new SessionNotFoundException(); |
|
} |
|
}
|
|
|