Commit f51a1f24 authored by Fabien Potencier's avatar Fabien Potencier

moved the middleware events to a proper event listener class

That removes the ugly route_*_middlewares_trigger services.
parent 3108bfa1
...@@ -37,6 +37,7 @@ use Symfony\Component\Routing\RequestContext; ...@@ -37,6 +37,7 @@ use Symfony\Component\Routing\RequestContext;
use Silex\RedirectableUrlMatcher; use Silex\RedirectableUrlMatcher;
use Silex\ControllerResolver; use Silex\ControllerResolver;
use Silex\EventListener\LocaleListener; use Silex\EventListener\LocaleListener;
use Silex\EventListener\MiddlewareListener;
/** /**
* The Silex framework class. * The Silex framework class.
...@@ -101,6 +102,7 @@ class Application extends \Pimple implements HttpKernelInterface, EventSubscribe ...@@ -101,6 +102,7 @@ class Application extends \Pimple implements HttpKernelInterface, EventSubscribe
$dispatcher->addSubscriber($app['exception_handler']); $dispatcher->addSubscriber($app['exception_handler']);
} }
$dispatcher->addSubscriber(new ResponseListener($app['charset'])); $dispatcher->addSubscriber(new ResponseListener($app['charset']));
$dispatcher->addSubscriber(new MiddlewareListener($app));
return $dispatcher; return $dispatcher;
}); });
...@@ -126,42 +128,6 @@ class Application extends \Pimple implements HttpKernelInterface, EventSubscribe ...@@ -126,42 +128,6 @@ class Application extends \Pimple implements HttpKernelInterface, EventSubscribe
return new RedirectableUrlMatcher($app['routes'], $app['request_context']); return new RedirectableUrlMatcher($app['routes'], $app['request_context']);
}); });
$this['route_before_middlewares_trigger'] = $this->protect(function (GetResponseEvent $event) use ($app) {
$request = $event->getRequest();
$routeName = $request->attributes->get('_route');
if (!$route = $app['routes']->get($routeName)) {
return;
}
foreach ((array) $route->getOption('_before_middlewares') as $callback) {
$ret = call_user_func($callback, $request, $app);
if ($ret instanceof Response) {
$event->setResponse($ret);
return;
} elseif (null !== $ret) {
throw new \RuntimeException(sprintf('A before middleware for route "%s" returned an invalid response value. Must return null or an instance of Response.', $routeName));
}
}
});
$this['route_after_middlewares_trigger'] = $this->protect(function (FilterResponseEvent $event) use ($app) {
$request = $event->getRequest();
$routeName = $request->attributes->get('_route');
if (!$route = $app['routes']->get($routeName)) {
return;
}
foreach ((array) $route->getOption('_after_middlewares') as $callback) {
$response = call_user_func($callback, $request, $event->getResponse());
if ($response instanceof Response) {
$event->setResponse($response);
} elseif (null !== $response) {
throw new \RuntimeException(sprintf('An after middleware for route "%s" returned an invalid response value. Must return null or an instance of Response.', $routeName));
}
}
});
$this['request_error'] = $this->protect(function () { $this['request_error'] = $this->protect(function () {
throw new \RuntimeException('Accessed request service outside of request scope. Try moving that call to a before handler or controller.'); throw new \RuntimeException('Accessed request service outside of request scope. Try moving that call to a before handler or controller.');
}); });
...@@ -532,16 +498,6 @@ class Application extends \Pimple implements HttpKernelInterface, EventSubscribe ...@@ -532,16 +498,6 @@ class Application extends \Pimple implements HttpKernelInterface, EventSubscribe
$this['kernel']->terminate($request, $response); $this['kernel']->terminate($request, $response);
} }
/**
* Runs before filters.
*
* @param GetResponseEvent $event The event to handle
*/
public function onKernelRequest(GetResponseEvent $event)
{
$this['route_before_middlewares_trigger']($event);
}
/** /**
* Handles converters. * Handles converters.
* *
...@@ -571,25 +527,13 @@ class Application extends \Pimple implements HttpKernelInterface, EventSubscribe ...@@ -571,25 +527,13 @@ class Application extends \Pimple implements HttpKernelInterface, EventSubscribe
$event->setResponse($response); $event->setResponse($response);
} }
/**
* Runs after filters.
*
* @param FilterResponseEvent $event The event to handle
*/
public function onKernelResponse(FilterResponseEvent $event)
{
$this['route_after_middlewares_trigger']($event);
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public static function getSubscribedEvents() public static function getSubscribedEvents()
{ {
return array( return array(
KernelEvents::REQUEST => array('onKernelRequest', -128),
KernelEvents::CONTROLLER => array('onKernelController', 0), KernelEvents::CONTROLLER => array('onKernelController', 0),
KernelEvents::RESPONSE => array('onKernelResponse', 128),
KernelEvents::VIEW => array('onKernelView', -10), KernelEvents::VIEW => array('onKernelView', -10),
); );
} }
......
<?php
/*
* This file is part of the Silex framework.
*
* (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 Silex\EventListener;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Silex\Application;
/**
* Manages the route middlewares.
*
* @author Fabien Potencier <fabien@symfony.com>
*/
class MiddlewareListener implements EventSubscriberInterface
{
protected $app;
/**
* Constructor.
*
* @param Application $app An Application instance
*/
public function __construct(Application $app)
{
$this->app = $app;
}
/**
* Runs before filters.
*
* @param GetResponseEvent $event The event to handle
*/
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$routeName = $request->attributes->get('_route');
if (!$route = $this->app['routes']->get($routeName)) {
return;
}
foreach ((array) $route->getOption('_before_middlewares') as $callback) {
$ret = call_user_func($callback, $request, $this->app);
if ($ret instanceof Response) {
$event->setResponse($ret);
return;
} elseif (null !== $ret) {
throw new \RuntimeException(sprintf('A before middleware for route "%s" returned an invalid response value. Must return null or an instance of Response.', $routeName));
}
}
}
/**
* Runs after filters.
*
* @param FilterResponseEvent $event The event to handle
*/
public function onKernelResponse(FilterResponseEvent $event)
{
$request = $event->getRequest();
$routeName = $request->attributes->get('_route');
if (!$route = $this->app['routes']->get($routeName)) {
return;
}
foreach ((array) $route->getOption('_after_middlewares') as $callback) {
$response = call_user_func($callback, $request, $event->getResponse());
if ($response instanceof Response) {
$event->setResponse($response);
} elseif (null !== $response) {
throw new \RuntimeException(sprintf('An after middleware for route "%s" returned an invalid response value. Must return null or an instance of Response.', $routeName));
}
}
}
public static function getSubscribedEvents()
{
return array(
KernelEvents::REQUEST => array('onKernelRequest', -128),
KernelEvents::RESPONSE => array('onKernelResponse', 128),
);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment