Skip to content

Instantly share code, notes, and snippets.

@leek
Created March 23, 2012 07:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leek/2168035 to your computer and use it in GitHub Desktop.
Save leek/2168035 to your computer and use it in GitHub Desktop.
Symfony2 Event Listener that allows you to set Response parameters and still use the @template annotation from the SensioFrameworkExtraBundle
<?php
namespace Example\AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller,
Symfony\Component\HttpFoundation\Request,
Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
class ExampleController extends Controller
{
/**
* @Template
*/
public function indexAction(Request $request)
{
return array(
'statusCode' => '... some status code ...',
'lastModified' => '... some date ...',
);
}
}
<?php
namespace Example\AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
class ResponseListener
{
/**
* @var array
*/
protected $_responseParameters = array(
'last_modified' => 'setLastModified',
'status_code' => 'setStatusCode',
);
/**
* @param GetResponseForControllerResultEvent $event A GetResponseForControllerResultEvent instance
*/
public function onKernelView(GetResponseForControllerResultEvent $event)
{
$request = $event->getRequest();
$parameters = $event->getControllerResult();
if (!empty($parameters)) {
$response = array();
foreach ($parameters as $parameter => $value) {
if (isset($this->_responseParameters[$parameter])) {
$response[$parameter] = $value;
}
}
if (!empty($response)) {
$request->attributes->set('_response', $response);
}
}
}
/**
* @param GetResponseForControllerResultEvent $event A GetResponseForControllerResultEvent instance
*/
public function onKernelResponse(FilterResponseEvent $event)
{
$request = $event->getRequest();
$parameters = $request->attributes->get('_response');
if (!empty($parameters)) {
$response = $event->getResponse();
foreach ($parameters as $parameter => $value) {
$method = $this->_responseParameters[$parameter];
$response->{$method}($value);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment