ソースを参照

Supporting regex on dispatcher "for" condition

Juan Basso 12 年 前
コミット
a3509a7202

+ 8 - 1
src/Routing/DispatcherFilter.php

@@ -149,7 +149,14 @@ class DispatcherFilter implements EventListener {
 		$request = $event->data['request'];
 		$pass = true;
 		if (!empty($this->_config['for'])) {
-			$pass = strpos($request->here(false), $this->_config['for']) === 0;
+			$len = strlen('preg:');
+			$for = $this->_config['for'];
+			$url = $request->here(false);
+			if (substr($for, 0, $len) === 'preg:') {
+				$pass = (bool)preg_match(substr($for, $len), $url);
+			} else {
+				$pass = strpos($url, $for) === 0;
+			}
 		}
 		if ($pass && !empty($this->_config['when'])) {
 			$response = $event->data['response'];

+ 9 - 0
tests/TestCase/Routing/DispatcherFilterTest.php

@@ -85,6 +85,15 @@ class DispatcherFilterTest extends TestCase {
 		$request = new Request(['url' => '/blog/articles']);
 		$event = new Event('Dispatcher.beforeDispatch', $this, compact('request'));
 		$this->assertFalse($filter->matches($event), 'Does not start with /articles');
+
+		$request = new Request(['url' => '/articles/edit/1']);
+		$event = new Event('Dispatcher.beforeDispatch', $this, compact('request'));
+		$filter = new DispatcherFilter(['for' => 'preg:#^/articles/edit/\d+$#']);
+		$this->assertTrue($filter->matches($event));
+
+		$request = new Request(['url' => '/blog/articles/edit/1']);
+		$event = new Event('Dispatcher.beforeDispatch', $this, compact('request'));
+		$this->assertFalse($filter->matches($event), 'Does not start with /articles');
 	}
 
 /**