Przeglądaj źródła

Use database transactions and `create()` when instantiating factory models

shalvah 5 lat temu
rodzic
commit
09aeebd712

+ 30 - 0
src/Extracting/DatabaseTransactionHelpers.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace Knuckles\Scribe\Extracting;
+
+use Exception;
+
+trait DatabaseTransactionHelpers
+{
+    /**
+     * @return void
+     */
+    private function startDbTransaction()
+    {
+        try {
+            app('db')->beginTransaction();
+        } catch (Exception $e) {
+        }
+    }
+
+    /**
+     * @return void
+     */
+    private function endDbTransaction()
+    {
+        try {
+            app('db')->rollBack();
+        } catch (Exception $e) {
+        }
+    }
+}

+ 2 - 23
src/Extracting/Strategies/Responses/ResponseCalls.php

@@ -9,6 +9,7 @@ use Illuminate\Http\Request;
 use Illuminate\Http\Response;
 use Illuminate\Routing\Route;
 use Illuminate\Support\Str;
+use Knuckles\Scribe\Extracting\DatabaseTransactionHelpers;
 use Knuckles\Scribe\Extracting\ParamHelpers;
 use Knuckles\Scribe\Extracting\Strategies\Strategy;
 use Knuckles\Scribe\Tools\Flags;
@@ -21,7 +22,7 @@ use ReflectionFunctionAbstract;
  */
 class ResponseCalls extends Strategy
 {
-    use ParamHelpers;
+    use ParamHelpers, DatabaseTransactionHelpers;
 
     /**
      * @param Route $route
@@ -140,28 +141,6 @@ class ResponseCalls extends Strategy
         }
     }
 
-    /**
-     * @return void
-     */
-    private function startDbTransaction()
-    {
-        try {
-            app('db')->beginTransaction();
-        } catch (Exception $e) {
-        }
-    }
-
-    /**
-     * @return void
-     */
-    private function endDbTransaction()
-    {
-        try {
-            app('db')->rollBack();
-        } catch (Exception $e) {
-        }
-    }
-
     /**
      * @return void
      */

+ 11 - 1
src/Extracting/Strategies/Responses/UseApiResourceTags.php

@@ -12,6 +12,7 @@ use Illuminate\Pagination\LengthAwarePaginator;
 use Illuminate\Pagination\Paginator;
 use Illuminate\Routing\Route;
 use Illuminate\Support\Arr;
+use Knuckles\Scribe\Extracting\DatabaseTransactionHelpers;
 use Knuckles\Scribe\Tools\AnnotationParser;
 use League\Fractal\Resource\Collection;
 use Knuckles\Scribe\Extracting\RouteDocBlocker;
@@ -28,6 +29,8 @@ use ReflectionFunctionAbstract;
  */
 class UseApiResourceTags extends Strategy
 {
+    use DatabaseTransactionHelpers;
+
     /**
      * @param Route $route
      * @param ReflectionClass $controller
@@ -170,6 +173,7 @@ class UseApiResourceTags extends Strategy
      */
     protected function instantiateApiResourceModel(string $type, array $factoryStates = [], array $relations = [])
     {
+        $this->startDbTransaction();
         try {
             // Try Eloquent model factory
 
@@ -181,7 +185,11 @@ class UseApiResourceTags extends Strategy
             if (count($factoryStates)) {
                 $factory->states($factoryStates);
             }
-            return $factory->make();
+            try {
+                return $factory->create();
+            } catch (Exception $e) {
+                return $factory->make();
+            }
         } catch (Exception $e) {
             if (Flags::$shouldBeVerbose) {
                 clara('knuckleswtf/scribe')->warn("Eloquent model factory failed to instantiate {$type}; trying to fetch from database.");
@@ -202,6 +210,8 @@ class UseApiResourceTags extends Strategy
                     }
                 }
             }
+        } finally {
+            $this->endDbTransaction();
         }
 
         return $instance;

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

@@ -3,11 +3,11 @@
 namespace Knuckles\Scribe\Extracting\Strategies\Responses;
 
 use Exception;
-use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Model as IlluminateModel;
 use Illuminate\Pagination\LengthAwarePaginator;
 use Illuminate\Routing\Route;
 use Illuminate\Support\Arr;
+use Knuckles\Scribe\Extracting\DatabaseTransactionHelpers;
 use Knuckles\Scribe\Tools\AnnotationParser;
 use League\Fractal\Manager;
 use League\Fractal\Resource\Collection;
@@ -26,6 +26,8 @@ use ReflectionFunctionAbstract;
  */
 class UseTransformerTags extends Strategy
 {
+    use DatabaseTransactionHelpers;
+
     /**
      * @param Route $route
      * @param ReflectionClass $controller
@@ -161,6 +163,7 @@ class UseTransformerTags extends Strategy
 
     protected function instantiateTransformerModel(string $type, array $factoryStates = [], array $relations = [])
     {
+        $this->startDbTransaction();
         try {
             // try Eloquent model factory
 
@@ -172,7 +175,13 @@ class UseTransformerTags extends Strategy
             if (count($factoryStates)) {
                 $factory->states($factoryStates);
             }
-            return $factory->make();
+
+            try {
+                return $factory->create();
+            } catch (Exception $e) {
+                // If there was no working database, it would fail.
+                return $factory->make();
+            }
         } catch (Exception $e) {
             if (Flags::$shouldBeVerbose) {
                 clara('knuckleswtf/scribe')->warn("Eloquent model factory failed to instantiate {$type}; trying to fetch from database.");
@@ -193,6 +202,8 @@ class UseTransformerTags extends Strategy
                     }
                 }
             }
+        } finally {
+            $this->endDbTransaction();
         }
 
         return $instance;