Browse Source

Merge pull request #12100 from cakephp/4x-route-load

4.x - Remove automatic route loading.
Mark Story 8 years ago
parent
commit
a0b220ff5f

+ 2 - 4
src/Http/BaseApplication.php

@@ -164,10 +164,8 @@ abstract class BaseApplication implements
      */
     public function routes($routes)
     {
-        if (!Router::$initialized) {
-            // Prevent routes from being loaded again
-            Router::$initialized = true;
-
+        // Only load routes if the router is empty
+        if (!Router::routes()) {
             require $this->configDir . '/routes.php';
         }
     }

+ 0 - 38
src/Routing/Router.php

@@ -36,14 +36,6 @@ class Router
 {
 
     /**
-     * Have routes been loaded
-     *
-     * @var bool
-     * @deprecated 3.5.0 Routes will be loaded via the Application::routes() hook in 4.0.0
-     */
-    public static $initialized = false;
-
-    /**
      * Default route class.
      *
      * @var string
@@ -204,7 +196,6 @@ class Router
      */
     public static function connect($route, $defaults = [], $options = [])
     {
-        static::$initialized = true;
         static::scope('/', function ($routes) use ($route, $defaults, $options) {
             $routes->connect($route, $defaults, $options);
         });
@@ -219,10 +210,6 @@ class Router
      */
     public static function parseRequest(ServerRequestInterface $request)
     {
-        if (!static::$initialized) {
-            static::_loadRoutes();
-        }
-
         return static::$_collection->parseRequest($request);
     }
 
@@ -425,10 +412,6 @@ class Router
      */
     public static function url($url = null, $full = false)
     {
-        if (!static::$initialized) {
-            static::_loadRoutes();
-        }
-
         $params = [
             'plugin' => null,
             'controller' => null,
@@ -718,10 +701,6 @@ class Router
     {
         $collection = static::$_collection;
         if ($extensions === null) {
-            if (!static::$initialized) {
-                static::_loadRoutes();
-            }
-
             return array_unique(array_merge(static::$_defaultExtensions, $collection->getExtensions()));
         }
         $extensions = (array)$extensions;
@@ -891,26 +870,10 @@ class Router
      */
     public static function routes()
     {
-        if (!static::$initialized) {
-            static::_loadRoutes();
-        }
-
         return static::$_collection->routes();
     }
 
     /**
-     * Loads route configuration
-     *
-     * @deprecated 3.5.0 Routes will be loaded via the Application::routes() hook in 4.0.0
-     * @return void
-     */
-    protected static function _loadRoutes()
-    {
-        static::$initialized = true;
-        include CONFIG . 'routes.php';
-    }
-
-    /**
      * Get the RouteCollection inside the Router
      *
      * @return \Cake\Routing\RouteCollection
@@ -929,6 +892,5 @@ class Router
     public static function setRouteCollection($routeCollection)
     {
         static::$_collection = $routeCollection;
-        static::$initialized = true;
     }
 }

+ 0 - 7
tests/TestCase/Controller/Component/RequestHandlerComponentTest.php

@@ -145,7 +145,6 @@ class RequestHandlerComponentTest extends TestCase
     public function testInitializeContentTypeSettingExt()
     {
         Router::reload();
-        Router::$initialized = true;
         $this->Controller->setRequest($this->request->withHeader('Accept', 'application/json'));
 
         $this->RequestHandler->ext = null;
@@ -161,7 +160,6 @@ class RequestHandlerComponentTest extends TestCase
     public function testInitializeContentTypeWithjQueryAccept()
     {
         Router::reload();
-        Router::$initialized = true;
         $this->Controller->setRequest($this->request
             ->withHeader('Accept', 'application/json, application/javascript, */*; q=0.01')
             ->withHeader('X-Requested-With', 'XMLHttpRequest'));
@@ -180,7 +178,6 @@ class RequestHandlerComponentTest extends TestCase
     public function testInitializeContentTypeWithjQueryTextPlainAccept()
     {
         Router::reload();
-        Router::$initialized = true;
         $this->Controller->setRequest($this->request->withHeader('Accept', 'text/plain, */*; q=0.01'));
 
         $this->RequestHandler->startup(new Event('Controller.startup', $this->Controller));
@@ -196,7 +193,6 @@ class RequestHandlerComponentTest extends TestCase
     public function testInitializeContentTypeWithjQueryAcceptAndMultiplesExtensions()
     {
         Router::reload();
-        Router::$initialized = true;
         $this->Controller->setRequest($this->request->withHeader('Accept', 'application/json, application/javascript, */*; q=0.01'));
         $this->RequestHandler->ext = null;
         Router::extensions(['rss', 'json'], false);
@@ -213,7 +209,6 @@ class RequestHandlerComponentTest extends TestCase
     public function testInitializeNoContentTypeWithSingleAccept()
     {
         Router::reload();
-        Router::$initialized = true;
         $_SERVER['HTTP_ACCEPT'] = 'application/json, text/html, */*; q=0.01';
         $this->assertNull($this->RequestHandler->ext);
 
@@ -256,7 +251,6 @@ class RequestHandlerComponentTest extends TestCase
     public function testInitializeContentTypeWithMultipleAcceptedTypes()
     {
         Router::reload();
-        Router::$initialized = true;
         $this->Controller->setRequest($this->request->withHeader(
             'Accept',
             'text/csv;q=1.0, application/json;q=0.8, application/xml;q=0.7'
@@ -275,7 +269,6 @@ class RequestHandlerComponentTest extends TestCase
     public function testInitializeAmbiguousAndroidAccepts()
     {
         Router::reload();
-        Router::$initialized = true;
         $this->request = $this->request->withEnv(
             'HTTP_ACCEPT',
             'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'

+ 0 - 24
tests/TestCase/Http/BaseApplicationTest.php

@@ -212,28 +212,4 @@ class BaseApplicationTest extends TestCase
             'Nested plugin should have bootstrap run'
         );
     }
-
-    /**
-     * Ensure that Router::$initialized is toggled even if the routes
-     * file fails. This prevents the routes file from being re-parsed
-     * during the error handling process.
-     *
-     * @return void
-     */
-    public function testRouteHookInitializesRouterOnError()
-    {
-        $app = $this->getMockForAbstractClass(
-            'Cake\Http\BaseApplication',
-            [TEST_APP . 'invalid_routes' . DS]
-        );
-        $builder = Router::createRouteBuilder('/');
-        try {
-            $app->routes($builder);
-
-            $this->fail('invalid_routes/routes.php file should raise an error.');
-        } catch (\InvalidArgumentException $e) {
-            $this->assertTrue(Router::$initialized, 'Should be toggled to prevent duplicate route errors');
-            $this->assertContains('route class', $e->getMessage());
-        }
-    }
 }

+ 0 - 6
tests/TestCase/Routing/Middleware/RoutingMiddlewareTest.php

@@ -146,7 +146,6 @@ class RoutingMiddlewareTest extends TestCase
     public function testRoutesHookInvokedOnApp()
     {
         Router::reload();
-        $this->assertFalse(Router::$initialized, 'Router precondition failed');
 
         $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/app/articles']);
         $response = new Response();
@@ -159,7 +158,6 @@ class RoutingMiddlewareTest extends TestCase
                 '_matchedRoute' => '/app/articles'
             ];
             $this->assertEquals($expected, $req->getAttribute('params'));
-            $this->assertTrue(Router::$initialized, 'Router state should indicate routes loaded');
             $this->assertNotEmpty(Router::routes());
             $this->assertEquals('/app/articles', Router::routes()[0]->template);
         };
@@ -176,7 +174,6 @@ class RoutingMiddlewareTest extends TestCase
     public function testRoutesHookCallsPluginHook()
     {
         Router::reload();
-        $this->assertFalse(Router::$initialized, 'Router precondition failed');
 
         $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/app/articles']);
         $response = new Response();
@@ -469,7 +466,6 @@ class RoutingMiddlewareTest extends TestCase
             'engine' => 'File',
             'path' => TMP,
         ]);
-        Router::$initialized = false;
         $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/articles']);
         $response = new Response();
         $next = function ($req, $res) use ($cacheConfigName) {
@@ -499,7 +495,6 @@ class RoutingMiddlewareTest extends TestCase
             'engine' => 'File',
             'path' => TMP,
         ]);
-        Router::$initialized = false;
         $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/articles']);
         $response = new Response();
         $next = function ($req, $res) use ($cacheConfigName) {
@@ -531,7 +526,6 @@ class RoutingMiddlewareTest extends TestCase
             'engine' => 'File',
             'path' => TMP,
         ]);
-        Router::$initialized = false;
         $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/articles']);
         $response = new Response();
         $next = function ($req, $res) {

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

@@ -63,6 +63,9 @@ class RouterTest extends TestCase
      */
     public function testBaseUrl()
     {
+        Router::scope('/', function ($routes) {
+            $routes->fallbacks();
+        });
         $this->assertRegExp('/^http(s)?:\/\//', Router::url('/', true));
         $this->assertRegExp('/^http(s)?:\/\//', Router::url(null, true));
         $this->assertRegExp('/^http(s)?:\/\//', Router::url(['_full' => true]));
@@ -75,6 +78,9 @@ class RouterTest extends TestCase
      */
     public function testFullBaseURL()
     {
+        Router::scope('/', function ($routes) {
+            $routes->fallbacks();
+        });
         Router::fullBaseUrl('http://example.com');
         $this->assertEquals('http://example.com/', Router::url('/', true));
         $this->assertEquals('http://example.com', Configure::read('App.fullBaseUrl'));
@@ -2466,6 +2472,9 @@ class RouterTest extends TestCase
 
     public function testReverseFull()
     {
+        Router::scope('/', function ($routes) {
+            $routes->fallbacks();
+        });
         $params = [
             'lang' => 'eng',
             'controller' => 'posts',

+ 0 - 1
tests/TestCase/TestSuite/IntegrationTestCaseTest.php

@@ -48,7 +48,6 @@ class IntegrationTestCaseTest extends IntegrationTestCase
             $routes->options('/options/:controller/:action', []);
             $routes->connect('/:controller/:action/*', []);
         });
-        Router::$initialized = true;
     }
 
     /**

+ 7 - 1
tests/TestCase/View/Helper/BreadcrumbsHelperTest.php

@@ -14,6 +14,7 @@
  */
 namespace Cake\Test\TestCase\View\Helper;
 
+use Cake\Routing\Router;
 use Cake\TestSuite\TestCase;
 use Cake\View\Helper\BreadcrumbsHelper;
 use Cake\View\View;
@@ -38,6 +39,11 @@ class BreadcrumbsHelperTest extends TestCase
         parent::setUp();
         $view = new View();
         $this->breadcrumbs = new BreadcrumbsHelper($view);
+
+        Router::reload();
+        Router::scope('/', function ($routes) {
+            $routes->fallbacks();
+        });
     }
 
     /**
@@ -399,7 +405,7 @@ class BreadcrumbsHelperTest extends TestCase
             '/span',
             '/li',
             ['li' => []],
-            ['a' => ['href' => '/some_alias']],
+            ['a' => ['href' => '/tests_apps/some_method']],
             'Some text',
             '/a',
             '/li',

+ 5 - 0
tests/TestCase/View/Helper/HtmlHelperTest.php

@@ -76,6 +76,10 @@ class HtmlHelperTest extends TestCase
         Plugin::load(['TestTheme']);
         static::setAppNamespace();
         Configure::write('Asset.timestamp', false);
+
+        Router::scope('/', function ($routes) {
+            $routes->fallbacks();
+        });
     }
 
     /**
@@ -87,6 +91,7 @@ class HtmlHelperTest extends TestCase
     {
         parent::tearDown();
         Plugin::unload('TestTheme');
+        Router::reload();
         unset($this->Html, $this->View);
     }
 

+ 7 - 4
tests/TestCase/View/Helper/UrlHelperTest.php

@@ -42,13 +42,15 @@ class UrlHelperTest extends TestCase
     {
         parent::setUp();
 
-        Router::reload();
         $this->View = new View();
         $this->Helper = new UrlHelper($this->View);
         $this->Helper->request = new ServerRequest();
 
         static::setAppNamespace();
         Plugin::load(['TestTheme']);
+        Router::scope('/', function ($routes) {
+            $routes->fallbacks();
+        });
     }
 
     /**
@@ -62,6 +64,7 @@ class UrlHelperTest extends TestCase
         Configure::delete('Asset');
 
         Plugin::unload();
+        Router::reload();
         unset($this->Helper, $this->View);
     }
 
@@ -81,7 +84,7 @@ class UrlHelperTest extends TestCase
         $this->assertEquals('/controller/action/1?one=1&two=2', $result);
 
         $result = $this->Helper->build(['controller' => 'posts', 'action' => 'index', 'page' => '1" onclick="alert(\'XSS\');"']);
-        $this->assertEquals('/posts/index?page=1%22+onclick%3D%22alert%28%27XSS%27%29%3B%22', $result);
+        $this->assertEquals('/posts?page=1%22+onclick%3D%22alert%28%27XSS%27%29%3B%22', $result);
 
         $result = $this->Helper->build('/controller/action/1/param:this+one+more');
         $this->assertEquals('/controller/action/1/param:this+one+more', $result);
@@ -95,13 +98,13 @@ class UrlHelperTest extends TestCase
         $result = $this->Helper->build([
             'controller' => 'posts', 'action' => 'index', 'param' => '%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24'
         ]);
-        $this->assertEquals('/posts/index?param=%257Baround%2520here%257D%255Bthings%255D%255Bare%255D%2524%2524', $result);
+        $this->assertEquals('/posts?param=%257Baround%2520here%257D%255Bthings%255D%255Bare%255D%2524%2524', $result);
 
         $result = $this->Helper->build([
             'controller' => 'posts', 'action' => 'index', 'page' => '1',
             '?' => ['one' => 'value', 'two' => 'value', 'three' => 'purple']
         ]);
-        $this->assertEquals('/posts/index?one=value&two=value&three=purple&page=1', $result);
+        $this->assertEquals('/posts?one=value&two=value&three=purple&page=1', $result);
     }
 
     /**