Browse Source

Patch model factory implementation for L8

shalvah 4 years ago
parent
commit
ea64a5f161

+ 3 - 3
composer.json

@@ -21,9 +21,9 @@
     "ext-json": "*",
     "erusev/parsedown": "^1.7.4",
     "fzaninotto/faker": "^1.9.1",
-    "illuminate/console": "^8.0",
-    "illuminate/routing": "^8.0",
-    "illuminate/support": "^8.0",
+    "illuminate/console": "^5.8|^6.0|^7.0|^8.0",
+    "illuminate/routing": "^5.8|^6.0|^7.0|^8.0",
+    "illuminate/support": "^5.8|^6.0|^7.0|^8.0",
     "knuckleswtf/pastel": "^1.3.5",
     "league/flysystem": "^1.0",
     "mpociot/reflection-docblock": "^1.0.1",

+ 1 - 1
docs/documenting/documenting-endpoint-responses.md

@@ -297,7 +297,7 @@ When generating responses from `@apiResource` and `@transformer` tags, Scribe ne
 3. If that fails, Scribe creates an instance using `new YourModel()`.
 
 ### Applying factory states
-If you want specific states to be applied to your model when instantiating via `factory(YourModel::class)`, you can use the `states` attribute on `@apiResourceModel` or `@transformerModel`. Separate multiple states with a comma.
+If you want specific states to be applied to your model when instantiating via the Laravel model factory, you can use the `states` attribute on `@apiResourceModel` or `@transformerModel`. Separate multiple states with a comma.
 
 ```php
 /**

+ 2 - 4
src/Extracting/Strategies/Responses/UseApiResourceTags.php

@@ -18,6 +18,7 @@ use Knuckles\Scribe\Extracting\Strategies\Strategy;
 use Knuckles\Scribe\Tools\AnnotationParser as a;
 use Knuckles\Scribe\Tools\ConsoleOutputUtils as c;
 use Knuckles\Scribe\Tools\ErrorHandlingUtils as e;
+use Knuckles\Scribe\Tools\Utils;
 use Mpociot\Reflection\DocBlock;
 use Mpociot\Reflection\DocBlock\Tag;
 use ReflectionClass;
@@ -178,10 +179,7 @@ class UseApiResourceTags extends Strategy
             // but the user might write it that way in a comment. Let's be safe.
             $type = ltrim($type, '\\');
 
-            $factory = factory($type);
-            if (count($factoryStates)) {
-                $factory->states($factoryStates);
-            }
+            $factory = Utils::getModelFactory($type, $factoryStates);
             try {
                 return $factory->create();
             } catch (Exception $e) {

+ 2 - 5
src/Extracting/Strategies/Responses/UseTransformerTags.php

@@ -13,6 +13,7 @@ use Knuckles\Scribe\Extracting\Strategies\Strategy;
 use Knuckles\Scribe\Tools\AnnotationParser as a;
 use Knuckles\Scribe\Tools\ConsoleOutputUtils as c;
 use Knuckles\Scribe\Tools\ErrorHandlingUtils as e;
+use Knuckles\Scribe\Tools\Utils;
 use League\Fractal\Manager;
 use League\Fractal\Resource\Collection;
 use League\Fractal\Resource\Item;
@@ -167,11 +168,7 @@ class UseTransformerTags extends Strategy
             // but the user might write it that way in a comment. Let's be safe.
             $type = ltrim($type, '\\');
 
-            $factory = factory($type);
-            if (count($factoryStates)) {
-                $factory->states($factoryStates);
-            }
-
+            $factory = Utils::getModelFactory($type, $factoryStates);
             try {
                 return $factory->create();
             } catch (Exception $e) {

+ 19 - 0
src/Tools/Utils.php

@@ -116,4 +116,23 @@ class Utils
         return (new ReflectionClass($class))->getMethod($method);
     }
 
+    public static function getModelFactory(string $modelName, array $states = [])
+    {
+        if (version_compare(app()->version(), '8.0.0', '>=')) {
+            $factory = call_user_func_array([$modelName, 'factory'], []);
+            if (count($states)) {
+                foreach ($states as $state) {
+                    $factory = $factory->$state();
+                }
+            }
+        } else {
+            $factory = factory($modelName);
+            if (count($states)) {
+                $factory = $factory->states($states);
+            }
+        }
+
+        return $factory;
+    }
+
 }

+ 4 - 3
tests/Fixtures/TestController.php

@@ -5,6 +5,7 @@ namespace Knuckles\Scribe\Tests\Fixtures;
 use Illuminate\Http\Request;
 use Illuminate\Routing\Controller;
 use Knuckles\Scribe\Tests\Unit\GeneratorTestCase;
+use Knuckles\Scribe\Tools\Utils;
 
 /**
  * @group Group A
@@ -174,7 +175,7 @@ class TestController extends Controller
      */
     public function withEloquentApiResource()
     {
-        return new TestUserApiResource(factory(TestUser::class)->make(['id' => 0]));
+        return new TestUserApiResource(Utils::getModelFactory(TestUser::class)->make(['id' => 0]));
     }
 
     /**
@@ -186,7 +187,7 @@ class TestController extends Controller
     public function withEloquentApiResourceCollection()
     {
         return TestUserApiResource::collection(
-            collect([factory(TestUser::class)->make(['id' => 0])])
+            collect([Utils::getModelFactory(TestUser::class)->make(['id' => 0])])
         );
     }
 
@@ -199,7 +200,7 @@ class TestController extends Controller
     public function withEloquentApiResourceCollectionClass()
     {
         return new TestUserApiResourceCollection(
-            collect([factory(TestUser::class)->make(['id' => 0])])
+            collect([Utils::getModelFactory(TestUser::class)->make(['id' => 0])])
         );
     }
 

+ 2 - 1
tests/Strategies/Responses/UseApiResourceTagsTest.php

@@ -6,6 +6,7 @@ use Knuckles\Scribe\Extracting\Strategies\Responses\UseApiResourceTags;
 use Knuckles\Scribe\ScribeServiceProvider;
 use Knuckles\Scribe\Tests\Fixtures\TestUser;
 use Knuckles\Scribe\Tools\DocumentationConfig;
+use Knuckles\Scribe\Tools\Utils;
 use Mpociot\Reflection\DocBlock\Tag;
 use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts;
 use Orchestra\Testbench\TestCase;
@@ -102,7 +103,7 @@ class UseApiResourceTagsTest extends TestCase
         $factory = app(\Illuminate\Database\Eloquent\Factory::class);
         $factory->afterMaking(TestUser::class, function (TestUser $user, $faker) {
             if ($user->id === 4) {
-                $child = factory(TestUser::class)->make(['id' => 5, 'parent_id' => 4]);
+                $child = Utils::getModelFactory(TestUser::class)->make(['id' => 5, 'parent_id' => 4]);
                 $user->setRelation('children', collect([$child]));
             }
         });