merged branch Tobion/requestmatcher (PR #4582)
Commits -------7464dcd
added phpdocc413e7b
[Routing] remove RequestContextAwareInterface from RequestMatcherInterface921be34
[Routing] fix phpdoc Discussion ---------- [Routing] RequestMatcherInterface doesn't need context Matchers that implement RequestMatcherInterface should match a Request, thus they don't need the request context. --------------------------------------------------------------------------- by travisbot at 2012-06-14T21:39:48Z This pull request [fails](http://travis-ci.org/symfony/symfony/builds/1624496) (merged f5ff1fe0 into7c91ee57
). --------------------------------------------------------------------------- by schmittjoh at 2012-06-15T13:32:59Z I think it makes sense to remove the RequestContext from the RequestMatcher. --------------------------------------------------------------------------- by travisbot at 2012-06-15T15:54:28Z This pull request [passes](http://travis-ci.org/symfony/symfony/builds/1628931) (merged7464dcd2
intof881d282
). --------------------------------------------------------------------------- by Tobion at 2012-06-26T12:32:06Z Anything missing?
This commit is contained in:
commit
8a3f5bd323
@ -89,6 +89,7 @@
|
||||
<tag name="kernel.event_subscriber" />
|
||||
<tag name="monolog.logger" channel="request" />
|
||||
<argument type="service" id="router" />
|
||||
<argument type="service" id="router.request_context" on-invalid="ignore" />
|
||||
<argument type="service" id="logger" on-invalid="ignore" />
|
||||
</service>
|
||||
</services>
|
||||
|
@ -21,25 +21,40 @@ use Symfony\Component\Routing\Exception\MethodNotAllowedException;
|
||||
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
|
||||
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
|
||||
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\RequestContextAwareInterface;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
|
||||
/**
|
||||
* Initializes request attributes based on a matching route.
|
||||
* Initializes the context from the request and sets request attributes based on a matching route.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class RouterListener implements EventSubscriberInterface
|
||||
{
|
||||
private $matcher;
|
||||
private $context;
|
||||
private $logger;
|
||||
|
||||
public function __construct($matcher, LoggerInterface $logger = null)
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param UrlMatcherInterface|RequestMatcherInterface $matcher The Url or Request matcher
|
||||
* @param RequestContext|null $context The RequestContext (can be null when $matcher implements RequestContextAwareInterface)
|
||||
* @param LoggerInterface|null $logger The logger
|
||||
*/
|
||||
public function __construct($matcher, RequestContext $context = null, LoggerInterface $logger = null)
|
||||
{
|
||||
if (!$matcher instanceof UrlMatcherInterface && !$matcher instanceof RequestMatcherInterface) {
|
||||
throw new \InvalidArgumentException('Matcher must either implement UrlMatcherInterface or RequestMatcherInterface.');
|
||||
}
|
||||
|
||||
if (null === $context && !$matcher instanceof RequestContextAwareInterface) {
|
||||
throw new \InvalidArgumentException('You must either pass a RequestContext or the matcher must implement RequestContextAwareInterface.');
|
||||
}
|
||||
|
||||
$this->matcher = $matcher;
|
||||
$this->context = $context ?: $matcher->getContext();
|
||||
$this->logger = $logger;
|
||||
}
|
||||
|
||||
@ -47,16 +62,17 @@ class RouterListener implements EventSubscriberInterface
|
||||
{
|
||||
$request = $event->getRequest();
|
||||
|
||||
$this->matcher->getContext()->fromRequest($request);
|
||||
// initialize the context that is also used by the generator (assuming matcher and generator share the same context instance)
|
||||
$this->context->fromRequest($request);
|
||||
|
||||
if ($request->attributes->has('_controller')) {
|
||||
// routing is already done
|
||||
return;
|
||||
}
|
||||
|
||||
// add attributes based on the path info (routing)
|
||||
// add attributes based on the request (routing)
|
||||
try {
|
||||
// matching requests is more powerful than matching URLs only, so try that first
|
||||
// matching a request is more powerful than matching a URL path + context, so try that first
|
||||
if ($this->matcher instanceof RequestMatcherInterface) {
|
||||
$parameters = $this->matcher->matchRequest($request);
|
||||
} else {
|
||||
|
@ -92,18 +92,13 @@ class RouterListenerTest extends \PHPUnit_Framework_TestCase
|
||||
$request = Request::create('http://localhost/');
|
||||
$event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
|
||||
|
||||
$context = new RequestContext();
|
||||
|
||||
$requestMatcher = $this->getMock('Symfony\Component\Routing\Matcher\RequestMatcherInterface');
|
||||
$requestMatcher->expects($this->any())
|
||||
->method('getContext')
|
||||
->will($this->returnValue($context));
|
||||
$requestMatcher->expects($this->once())
|
||||
->method('matchRequest')
|
||||
->with($this->isInstanceOf('Symfony\Component\HttpFoundation\Request'))
|
||||
->will($this->returnValue(array()));
|
||||
|
||||
$listener = new RouterListener($requestMatcher);
|
||||
$listener = new RouterListener($requestMatcher, new RequestContext());
|
||||
$listener->onKernelRequest($event);
|
||||
}
|
||||
|
||||
|
@ -12,16 +12,15 @@
|
||||
namespace Symfony\Component\Routing\Matcher;
|
||||
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Routing\RequestContextAwareInterface;
|
||||
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
|
||||
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
|
||||
|
||||
/**
|
||||
* UrlMatcherInterface is the interface that all URL matcher classes must implement.
|
||||
* RequestMatcherInterface is the interface that all request matcher classes must implement.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
interface RequestMatcherInterface extends RequestContextAwareInterface
|
||||
interface RequestMatcherInterface
|
||||
{
|
||||
/**
|
||||
* Tries to match a request with a set of routes.
|
||||
|
@ -25,7 +25,7 @@ use Symfony\Component\Routing\Exception\MethodNotAllowedException;
|
||||
interface UrlMatcherInterface extends RequestContextAwareInterface
|
||||
{
|
||||
/**
|
||||
* Tries to match a URL with a set of routes.
|
||||
* Tries to match a URL path with a set of routes.
|
||||
*
|
||||
* If the matcher can not find information, it must throw one of the exceptions documented
|
||||
* below.
|
||||
|
Reference in New Issue
Block a user