Browse Source

Merge branch '4.next' into 5.x

ADmad 3 years ago
parent
commit
e5b060f74e

+ 0 - 2
.github/workflows/ci.yml

@@ -91,8 +91,6 @@ jobs:
       run: |
         if ${{ matrix.prefer-lowest == 'prefer-lowest' }}; then
           composer update --prefer-lowest --prefer-stable
-        elif ${{ matrix.php-version == '8.2' }}; then
-          composer update --ignore-platform-req=php
         else
           composer update
         fi

+ 28 - 17
src/Command/RoutesCommand.php

@@ -45,7 +45,7 @@ class RoutesCommand extends Command
         $output = $duplicateRoutesCounter = [];
 
         foreach ($availableRoutes as $route) {
-            $methods = $route->defaults['_method'] ?? '';
+            $methods = isset($route->defaults['_method']) ? (array)$route->defaults['_method'] : [''];
 
             $item = [
                 $route->options['_name'] ?? $route->getName(),
@@ -54,7 +54,7 @@ class RoutesCommand extends Command
                 $route->defaults['prefix'] ?? '',
                 $route->defaults['controller'] ?? '',
                 $route->defaults['action'] ?? '',
-                is_string($methods) ? $methods : implode(', ', $methods),
+                implode(', ', $methods),
             ];
 
             if ($args->getOption('verbose')) {
@@ -64,10 +64,13 @@ class RoutesCommand extends Command
 
             $output[] = $item;
 
-            if (!isset($duplicateRoutesCounter[$route->template])) {
-                $duplicateRoutesCounter[$route->template] = 0;
+            foreach ($methods as $method) {
+                if (!isset($duplicateRoutesCounter[$route->template][$method])) {
+                    $duplicateRoutesCounter[$route->template][$method] = 0;
+                }
+
+                $duplicateRoutesCounter[$route->template][$method]++;
             }
-            $duplicateRoutesCounter[$route->template]++;
         }
 
         if ($args->getOption('sort')) {
@@ -84,18 +87,26 @@ class RoutesCommand extends Command
         $duplicateRoutes = [];
 
         foreach ($availableRoutes as $route) {
-            if ($duplicateRoutesCounter[$route->template] > 1) {
-                $methods = $route->defaults['_method'] ?? '';
-
-                $duplicateRoutes[] = [
-                    $route->options['_name'] ?? $route->getName(),
-                    $route->template,
-                    $route->defaults['plugin'] ?? '',
-                    $route->defaults['prefix'] ?? '',
-                    $route->defaults['controller'] ?? '',
-                    $route->defaults['action'] ?? '',
-                    is_string($methods) ? $methods : implode(', ', $methods),
-                ];
+            $methods = isset($route->defaults['_method']) ? (array)$route->defaults['_method'] : [''];
+
+            foreach ($methods as $method) {
+                if (
+                    $duplicateRoutesCounter[$route->template][$method] > 1 ||
+                    ($method === '' && count($duplicateRoutesCounter[$route->template]) > 1) ||
+                    ($method !== '' && isset($duplicateRoutesCounter[$route->template]['']))
+                ) {
+                    $duplicateRoutes[] = [
+                        $route->options['_name'] ?? $route->getName(),
+                        $route->template,
+                        $route->defaults['plugin'] ?? '',
+                        $route->defaults['prefix'] ?? '',
+                        $route->defaults['controller'] ?? '',
+                        $route->defaults['action'] ?? '',
+                        implode(', ', $methods),
+                    ];
+
+                    break;
+                }
             }
         }
 

+ 4 - 0
src/Http/BaseApplication.php

@@ -18,6 +18,7 @@ declare(strict_types=1);
 namespace Cake\Http;
 
 use Cake\Console\CommandCollection;
+use Cake\Controller\ComponentRegistry;
 use Cake\Controller\ControllerFactory;
 use Cake\Core\ConsoleApplicationInterface;
 use Cake\Core\Container;
@@ -322,6 +323,9 @@ abstract class BaseApplication implements
 
         $controller = $this->controllerFactory->create($request);
 
+        // This is needed for auto-wiring. Should be removed in 5.x
+        $container->add(ComponentRegistry::class, $controller->components());
+
         return $this->controllerFactory->invoke($controller);
     }
 }

+ 32 - 0
tests/TestCase/Command/RoutesCommandTest.php

@@ -298,6 +298,20 @@ class RoutesCommandTest extends TestCase
             new Route('/unique-path', [], ['_name' => '_bRoute'])
         );
 
+        $builder->connect(
+            new Route('/blog', ['_method' => 'GET'], ['_name' => 'blog-get'])
+        );
+        $builder->connect(
+            new Route('/blog', [], ['_name' => 'blog-all'])
+        );
+
+        $builder->connect(
+            new Route('/events', ['_method' => ['POST', 'PUT']], ['_name' => 'events-post'])
+        );
+        $builder->connect(
+            new Route('/events', ['_method' => 'GET'], ['_name' => 'events-get'])
+        );
+
         $this->exec('routes');
         $this->assertExitCode(CommandInterface::CODE_SUCCESS);
         $this->assertOutputContainsRow([
@@ -327,5 +341,23 @@ class RoutesCommandTest extends TestCase
             '',
             '',
         ]);
+        $this->assertOutputContainsRow([
+            'blog-get',
+            '/blog',
+            '',
+            '',
+            '',
+            '',
+            '',
+        ]);
+        $this->assertOutputContainsRow([
+            'blog-all',
+            '/blog',
+            '',
+            '',
+            '',
+            '',
+            '',
+        ]);
     }
 }

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

@@ -16,6 +16,7 @@ declare(strict_types=1);
  */
 namespace Cake\Test\TestCase\Http;
 
+use Cake\Controller\ComponentRegistry;
 use Cake\Core\BasePlugin;
 use Cake\Core\Configure;
 use Cake\Core\Container;
@@ -78,6 +79,7 @@ class BaseApplicationTest extends TestCase
         $container = $app->getContainer();
         $this->assertSame($request, $container->get(ServerRequest::class));
         $this->assertSame($container, $container->get(ContainerInterface::class));
+        $this->assertInstanceOf(ComponentRegistry::class, $container->get(ComponentRegistry::class));
     }
 
     /**