namespace Symfony\Component\HttpKernel\DataCollector;
+use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
- * RequestDataCollector.
- *
* @author Fabien Potencier <fabien@symfony.com>
*/
-class RequestDataCollector extends DataCollector implements EventSubscriberInterface
+class RequestDataCollector extends DataCollector implements EventSubscriberInterface, LateDataCollectorInterface
{
- /** @var \SplObjectStorage */
protected $controllers;
public function __construct()
*/
public function collect(Request $request, Response $response, \Exception $exception = null)
{
- $responseHeaders = $response->headers->all();
- foreach ($response->headers->getCookies() as $cookie) {
- $responseHeaders['set-cookie'][] = (string) $cookie;
- }
-
// attributes are serialized and as they can be anything, they need to be converted to strings.
$attributes = array();
$route = '';
$statusCode = $response->getStatusCode();
+ $responseCookies = array();
+ foreach ($response->headers->getCookies() as $cookie) {
+ $responseCookies[$cookie->getName()] = $cookie;
+ }
+
$this->data = array(
'method' => $request->getMethod(),
'format' => $request->getRequestFormat(),
'request_cookies' => $request->cookies->all(),
'request_attributes' => $attributes,
'route' => $route,
- 'response_headers' => $responseHeaders,
+ 'response_headers' => $response->headers->all(),
+ 'response_cookies' => $responseCookies,
'session_metadata' => $sessionMetadata,
'session_attributes' => $sessionAttributes,
'flashes' => $flashes,
continue;
}
if ('request_headers' === $key || 'response_headers' === $key) {
- $value = array_map(function ($v) { return isset($v[0]) && !isset($v[1]) ? $v[0] : $v; }, $value);
- }
- if ('request_server' !== $key && 'request_cookies' !== $key) {
- $this->data[$key] = array_map(array($this, 'cloneVar'), $value);
+ $this->data[$key] = array_map(function ($v) { return isset($v[0]) && !isset($v[1]) ? $v[0] : $v; }, $value);
}
}
unset($this->controllers[$request]);
}
- if (null !== $session && $session->isStarted()) {
- if ($request->attributes->has('_redirected')) {
- $this->data['redirect'] = $session->remove('sf_redirect');
- }
+ if ($request->attributes->has('_redirected') && $redirectCookie = $request->cookies->get('sf_redirect')) {
+ $this->data['redirect'] = json_decode($redirectCookie, true);
+
+ $response->headers->clearCookie('sf_redirect');
+ }
- if ($response->isRedirect()) {
- $session->set('sf_redirect', array(
+ if ($response->isRedirect()) {
+ $response->headers->setCookie(new Cookie(
+ 'sf_redirect',
+ json_encode(array(
'token' => $response->headers->get('x-debug-token'),
'route' => $request->attributes->get('_route', 'n/a'),
'method' => $request->getMethod(),
'controller' => $this->parseController($request->attributes->get('_controller')),
'status_code' => $statusCode,
'status_text' => Response::$statusTexts[(int) $statusCode],
- ));
- }
+ ))
+ ));
}
+
+ $this->data['identifier'] = $this->data['route'] ?: (is_array($this->data['controller']) ? $this->data['controller']['class'].'::'.$this->data['controller']['method'].'()' : $this->data['controller']);
+ }
+
+ public function lateCollect()
+ {
+ $this->data = $this->cloneVar($this->data);
+ }
+
+ public function reset()
+ {
+ $this->data = array();
+ $this->controllers = new \SplObjectStorage();
}
public function getMethod()
public function getRequestRequest()
{
- return new ParameterBag($this->data['request_request']);
+ return new ParameterBag($this->data['request_request']->getValue());
}
public function getRequestQuery()
{
- return new ParameterBag($this->data['request_query']);
+ return new ParameterBag($this->data['request_query']->getValue());
}
public function getRequestHeaders()
{
- return new ParameterBag($this->data['request_headers']);
+ return new ParameterBag($this->data['request_headers']->getValue());
}
public function getRequestServer($raw = false)
{
- return new ParameterBag($raw ? $this->data['request_server'] : array_map(array($this, 'cloneVar'), $this->data['request_server']));
+ return new ParameterBag($this->data['request_server']->getValue($raw));
}
public function getRequestCookies($raw = false)
{
- return new ParameterBag($raw ? $this->data['request_cookies'] : array_map(array($this, 'cloneVar'), $this->data['request_cookies']));
+ return new ParameterBag($this->data['request_cookies']->getValue($raw));
}
public function getRequestAttributes()
{
- return new ParameterBag($this->data['request_attributes']);
+ return new ParameterBag($this->data['request_attributes']->getValue());
}
public function getResponseHeaders()
{
- return new ParameterBag($this->data['response_headers']);
+ return new ParameterBag($this->data['response_headers']->getValue());
+ }
+
+ public function getResponseCookies()
+ {
+ return new ParameterBag($this->data['response_cookies']->getValue());
}
public function getSessionMetadata()
{
- return $this->data['session_metadata'];
+ return $this->data['session_metadata']->getValue();
}
public function getSessionAttributes()
{
- return $this->data['session_attributes'];
+ return $this->data['session_attributes']->getValue();
}
public function getFlashes()
{
- return $this->data['flashes'];
+ return $this->data['flashes']->getValue();
}
public function getContent()
public function getIdentifier()
{
- return $this->data['route'] ?: (is_array($this->data['controller']) ? $this->data['controller']['class'].'::'.$this->data['controller']['method'].'()' : $this->data['controller']);
+ return $this->data['identifier'];
}
/**
*/
public function getRouteParams()
{
- if (!isset($this->data['request_attributes']['_route_params'])) {
- return array();
- }
-
- $data = $this->data['request_attributes']['_route_params'];
- $rawData = $data->getRawData();
- if (!isset($rawData[1])) {
- return array();
- }
-
- $params = array();
- foreach ($rawData[1] as $k => $v) {
- $params[$k] = $data->seek($k);
- }
-
- return $params;
+ return isset($this->data['request_attributes']['_route_params']) ? $this->data['request_attributes']['_route_params']->getValue() : array();
}
/**
public function onKernelResponse(FilterResponseEvent $event)
{
- if (!$event->isMasterRequest() || !$event->getRequest()->hasSession() || !$event->getRequest()->getSession()->isStarted()) {
+ if (!$event->isMasterRequest()) {
return;
}
- if ($event->getRequest()->getSession()->has('sf_redirect')) {
+ if ($event->getRequest()->cookies->has('sf_redirect')) {
$event->getRequest()->attributes->set('_redirected', true);
}
}