Переглянути джерело

Improve error handling for cached routes

shalvah 2 роки тому
батько
коміт
fa49f53670

+ 2 - 2
src/Exceptions/CouldntGetRouteDetails.php

@@ -4,8 +4,8 @@ namespace Knuckles\Scribe\Exceptions;
 
 class CouldntGetRouteDetails extends \RuntimeException implements ScribeException
 {
-    public static function forRoute(string $route): self
+    public static function new(): self
     {
-        return new self("Unable to retrieve controller and method for route $route; try running `php artisan route:clear`");
+        return new self("Unable to retrieve controller and method for route; try running `php artisan route:clear`");
     }
 }

+ 6 - 3
src/GroupedEndpoints/GroupedEndpointsFromApp.php

@@ -104,7 +104,7 @@ class GroupedEndpointsFromApp implements GroupedEndpointsContract
             $route = $routeItem->getRoute();
 
             $routeControllerAndMethod = u::getRouteClassAndMethodNames($route);
-            if (!$this->isValidRoute($routeControllerAndMethod, $route)) {
+            if (!$this->isValidRoute($routeControllerAndMethod)) {
                 c::warn('Skipping invalid route: ' . c::getRouteRepresentation($route));
                 continue;
             }
@@ -219,11 +219,11 @@ class GroupedEndpointsFromApp implements GroupedEndpointsContract
         }
     }
 
-    private function isValidRoute(?array $routeControllerAndMethod, Route $route): bool
+    private function isValidRoute(?array $routeControllerAndMethod): bool
     {
         if (is_array($routeControllerAndMethod)) {
             if (count($routeControllerAndMethod) < 2) {
-                throw CouldntGetRouteDetails::forRoute(c::getRouteRepresentation($route));
+                throw CouldntGetRouteDetails::new();
             }
             [$classOrObject, $method] = $routeControllerAndMethod;
             if (u::isInvokableObject($classOrObject)) {
@@ -237,6 +237,9 @@ class GroupedEndpointsFromApp implements GroupedEndpointsContract
 
     private function doesControllerMethodExist(array $routeControllerAndMethod): bool
     {
+        if (count($routeControllerAndMethod) < 2) {
+            throw CouldntGetRouteDetails::new();
+        }
         [$class, $method] = $routeControllerAndMethod;
         $reflection = new ReflectionClass($class);
 

+ 10 - 2
src/Tools/Utils.php

@@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Routing\Route;
 use Illuminate\Support\Str;
 use Knuckles\Scribe\Exceptions\CouldntFindFactory;
+use Knuckles\Scribe\Exceptions\CouldntGetRouteDetails;
 use Knuckles\Scribe\Tools\ConsoleOutputUtils as c;
 use League\Flysystem\Filesystem;
 use League\Flysystem\Local\LocalFilesystemAdapter;
@@ -105,8 +106,12 @@ class Utils
             if (is_array($uses)) {
                 return $uses;
             } elseif (is_string($uses)) {
-                [$class, $method] = explode('@', $uses);
-                
+                $usesArray = explode('@', $uses);
+                if (count($usesArray) < 2) {
+                    throw CouldntGetRouteDetails::new();
+                }
+                [$class, $method] = $usesArray;
+
                 // Support for the Laravel Actions package, docblock should be put on the asController method
                 if ($method === '__invoke' && method_exists($class, 'asController'))
                 {
@@ -229,6 +234,9 @@ class Utils
      */
     public static function getReflectedRouteMethod(array $routeControllerAndMethod): ReflectionFunctionAbstract
     {
+        if (count($routeControllerAndMethod) < 2) {
+            throw CouldntGetRouteDetails::new();
+        }
         [$class, $method] = $routeControllerAndMethod;
 
         if ($class instanceof Closure) {