From 4ff7f198cb9c854b3bdfc35c7d199c0454408ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hendrik=20Bl=C3=B6=C3=9F?= Date: Thu, 7 May 2020 09:58:22 +0200 Subject: [PATCH 1/7] added multi db connection support (only transformer and apiResource strategies) --- src/Extracting/DatabaseTransactionHelpers.php | 12 ++++-- .../Strategies/Responses/ResponseCalls.php | 2 +- .../Responses/UseApiResourceTags.php | 13 ++++--- .../Responses/UseTransformerTags.php | 38 ++++++++++--------- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/src/Extracting/DatabaseTransactionHelpers.php b/src/Extracting/DatabaseTransactionHelpers.php index 0ddcdea3..b2e1a93a 100644 --- a/src/Extracting/DatabaseTransactionHelpers.php +++ b/src/Extracting/DatabaseTransactionHelpers.php @@ -7,23 +7,27 @@ trait DatabaseTransactionHelpers { /** + * @param string $connection + * * @return void */ - private function startDbTransaction() + private function startDbTransaction(String $connection = null) { try { - app('db')->beginTransaction(); + app('db')->connection($connection)->beginTransaction(); } catch (Exception $e) { } } /** + * @param string $connection + * * @return void */ - private function endDbTransaction() + private function endDbTransaction(String $connection = null) { try { - app('db')->rollBack(); + app('db')->connection($connection)->rollBack(); } catch (Exception $e) { } } diff --git a/src/Extracting/Strategies/Responses/ResponseCalls.php b/src/Extracting/Strategies/Responses/ResponseCalls.php index 3216ffbd..08172c57 100644 --- a/src/Extracting/Strategies/Responses/ResponseCalls.php +++ b/src/Extracting/Strategies/Responses/ResponseCalls.php @@ -3,12 +3,12 @@ namespace Knuckles\Scribe\Extracting\Strategies\Responses; use Dingo\Api\Dispatcher; +use Dingo\Api\Routing\Route as DingoRoute; use Exception; use Illuminate\Contracts\Http\Kernel; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Routing\Route; -use Dingo\Api\Routing\Route as DingoRoute; use Illuminate\Support\Str; use Knuckles\Scribe\Extracting\DatabaseTransactionHelpers; use Knuckles\Scribe\Extracting\ParamHelpers; diff --git a/src/Extracting/Strategies/Responses/UseApiResourceTags.php b/src/Extracting/Strategies/Responses/UseApiResourceTags.php index d105e5fd..4d8f7ddf 100644 --- a/src/Extracting/Strategies/Responses/UseApiResourceTags.php +++ b/src/Extracting/Strategies/Responses/UseApiResourceTags.php @@ -13,12 +13,12 @@ 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; use Knuckles\Scribe\Extracting\Strategies\Strategy; +use Knuckles\Scribe\Tools\AnnotationParser; use Knuckles\Scribe\Tools\Flags; use Knuckles\Scribe\Tools\Utils; +use League\Fractal\Resource\Collection; use Mpociot\Reflection\DocBlock; use Mpociot\Reflection\DocBlock\Tag; use ReflectionClass; @@ -50,7 +50,6 @@ public function __invoke(Route $route, ReflectionClass $controller, ReflectionFu try { return $this->getApiResourceResponse($methodDocBlock->getTags()); - } catch (Exception $e) { clara('knuckleswtf/scribe')->warn('Exception thrown when fetching Eloquent API resource response for [' . implode(',', $route->methods) . "] {$route->uri}."); if (Flags::$shouldBeVerbose) { @@ -101,7 +100,7 @@ public function getApiResourceResponse(array $tags) $perPage ); $list = $paginator; - } else if (count($pagination) == 2 && $pagination[0] == 'simple') { + } elseif (count($pagination) == 2 && $pagination[0] == 'simple') { $perPage = $pagination[1]; $paginator = new Paginator($models, $perPage); $list = $paginator; @@ -174,7 +173,9 @@ private function getClassToBeTransformedAndAttributes(array $tags): array */ protected function instantiateApiResourceModel(string $type, array $factoryStates = [], array $relations = []) { - $this->startDbTransaction(); + $connection = app($type)->getConnectionName(); + + $this->startDbTransaction($connection); try { // Try Eloquent model factory @@ -213,7 +214,7 @@ protected function instantiateApiResourceModel(string $type, array $factoryState } } } finally { - $this->endDbTransaction(); + $this->endDbTransaction($connection); } return $instance; diff --git a/src/Extracting/Strategies/Responses/UseTransformerTags.php b/src/Extracting/Strategies/Responses/UseTransformerTags.php index 1bb7807a..bdf4dafd 100644 --- a/src/Extracting/Strategies/Responses/UseTransformerTags.php +++ b/src/Extracting/Strategies/Responses/UseTransformerTags.php @@ -8,14 +8,14 @@ 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; -use League\Fractal\Resource\Item; use Knuckles\Scribe\Extracting\RouteDocBlocker; use Knuckles\Scribe\Extracting\Strategies\Strategy; +use Knuckles\Scribe\Tools\AnnotationParser; use Knuckles\Scribe\Tools\Flags; use Knuckles\Scribe\Tools\Utils; +use League\Fractal\Manager; +use League\Fractal\Resource\Collection; +use League\Fractal\Resource\Item; use Mpociot\Reflection\DocBlock; use Mpociot\Reflection\DocBlock\Tag; use ReflectionClass; @@ -68,19 +68,19 @@ public function __invoke(Route $route, ReflectionClass $controller, ReflectionFu */ public function getTransformerResponse(array $tags) { - if (empty($transformerTag = $this->getTransformerTag($tags))) { - return null; - } + if (empty($transformerTag = $this->getTransformerTag($tags))) { + return null; + } - [$statusCode, $transformer] = $this->getStatusCodeAndTransformerClass($transformerTag); - [$model, $factoryStates, $relations] = $this->getClassToBeTransformed($tags, (new ReflectionClass($transformer))->getMethod('transform')); - $modelInstance = $this->instantiateTransformerModel($model, $factoryStates, $relations); + [$statusCode, $transformer] = $this->getStatusCodeAndTransformerClass($transformerTag); + [$model, $factoryStates, $relations] = $this->getClassToBeTransformed($tags, (new ReflectionClass($transformer))->getMethod('transform')); + $modelInstance = $this->instantiateTransformerModel($model, $factoryStates, $relations); - $fractal = new Manager(); + $fractal = new Manager(); - if (! is_null($this->config->get('fractal.serializer'))) { - $fractal->setSerializer(app($this->config->get('fractal.serializer'))); - } + if (! is_null($this->config->get('fractal.serializer'))) { + $fractal->setSerializer(app($this->config->get('fractal.serializer'))); + } if ((strtolower($transformerTag->getName()) == 'transformercollection')) { $models = [$modelInstance, $this->instantiateTransformerModel($model, $factoryStates, $relations)]; @@ -99,9 +99,9 @@ public function getTransformerResponse(array $tags) $resource = new Item($modelInstance, new $transformer()); } - $response = response($fractal->createData($resource)->toJson()); + $response = response($fractal->createData($resource)->toJson()); - return [ + return [ [ 'status' => $statusCode ?: 200, 'content' => $response->getContent(), @@ -162,7 +162,9 @@ private function getClassToBeTransformed(array $tags, ReflectionFunctionAbstract protected function instantiateTransformerModel(string $type, array $factoryStates = [], array $relations = []) { - $this->startDbTransaction(); + $connection = app($type)->getConnectionName(); + + $this->startDbTransaction($connection); try { // try Eloquent model factory @@ -202,7 +204,7 @@ protected function instantiateTransformerModel(string $type, array $factoryState } } } finally { - $this->endDbTransaction(); + $this->endDbTransaction($connection); } return $instance; From de9cada6137f23ddbed648a00173e5a95232de0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hendrik=20Bl=C3=B6=C3=9F?= Date: Thu, 7 May 2020 11:24:04 +0200 Subject: [PATCH 2/7] added multi connection support for ResponseCalls --- .../Strategies/Responses/ResponseCalls.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Extracting/Strategies/Responses/ResponseCalls.php b/src/Extracting/Strategies/Responses/ResponseCalls.php index 08172c57..264d0bb8 100644 --- a/src/Extracting/Strategies/Responses/ResponseCalls.php +++ b/src/Extracting/Strategies/Responses/ResponseCalls.php @@ -90,7 +90,11 @@ public function makeResponseCall(Route $route, array $context, array $rulesToApp */ private function configureEnvironment(array $rulesToApply) { - $this->startDbTransaction(); + // Start transactions for all connections since we don't know wich one is used + $connections = array_keys(config('database.connections')); + foreach ($connections as $conn) { + $this->startDbTransaction($conn); + } $this->setLaravelConfigs($rulesToApply['config'] ?? []); } @@ -147,7 +151,11 @@ private function setLaravelConfigs(array $config) */ private function finish() { - $this->endDbTransaction(); + // Stop transactions for all connections since we started all of them. + $connections = array_keys(config('database.connections')); + foreach ($connections as $conn) { + $this->endDbTransaction($conn); + } } /** From 612db3347ab66f0a8e0bcb2318c09093e2c4dc0c Mon Sep 17 00:00:00 2001 From: hendrikbl Date: Thu, 7 May 2020 12:11:32 +0200 Subject: [PATCH 3/7] fixe failing test --- tests/Fixtures/TestModel.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Fixtures/TestModel.php b/tests/Fixtures/TestModel.php index ee57523b..cddfef82 100644 --- a/tests/Fixtures/TestModel.php +++ b/tests/Fixtures/TestModel.php @@ -2,12 +2,14 @@ namespace Knuckles\Scribe\Tests\Fixtures; +use Illuminate\Database\Eloquent\Model; + /** * A demo test model. * * @author Tobias van Beek */ -class TestModel +class TestModel extends Model { public $id = 1; From 194a265e28b079874ce86cbefd9408232076fb41 Mon Sep 17 00:00:00 2001 From: hendrikbl Date: Thu, 7 May 2020 14:40:43 +0200 Subject: [PATCH 4/7] moved transaction logic to transaction helpers --- src/Extracting/DatabaseTransactionHelpers.php | 24 ++++++++++++------- .../Strategies/Responses/ResponseCalls.php | 12 ++-------- .../Responses/UseApiResourceTags.php | 6 ++--- .../Responses/UseTransformerTags.php | 6 ++--- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/Extracting/DatabaseTransactionHelpers.php b/src/Extracting/DatabaseTransactionHelpers.php index b2e1a93a..8c0e2720 100644 --- a/src/Extracting/DatabaseTransactionHelpers.php +++ b/src/Extracting/DatabaseTransactionHelpers.php @@ -11,11 +11,15 @@ trait DatabaseTransactionHelpers * * @return void */ - private function startDbTransaction(String $connection = null) + private function startDbTransaction() { - try { - app('db')->connection($connection)->beginTransaction(); - } catch (Exception $e) { + $connections = array_keys(config('database.connections', [])); + + foreach ($connections as $conn) { + try { + app('db')->connection($conn)->beginTransaction(); + } catch (Exception $e) { + } } } @@ -24,11 +28,15 @@ private function startDbTransaction(String $connection = null) * * @return void */ - private function endDbTransaction(String $connection = null) + private function endDbTransaction() { - try { - app('db')->connection($connection)->rollBack(); - } catch (Exception $e) { + $connections = array_keys(config('database.connections', [])); + + foreach ($connections as $conn) { + try { + app('db')->connection($conn)->rollBack(); + } catch (Exception $e) { + } } } } diff --git a/src/Extracting/Strategies/Responses/ResponseCalls.php b/src/Extracting/Strategies/Responses/ResponseCalls.php index 264d0bb8..08172c57 100644 --- a/src/Extracting/Strategies/Responses/ResponseCalls.php +++ b/src/Extracting/Strategies/Responses/ResponseCalls.php @@ -90,11 +90,7 @@ public function makeResponseCall(Route $route, array $context, array $rulesToApp */ private function configureEnvironment(array $rulesToApply) { - // Start transactions for all connections since we don't know wich one is used - $connections = array_keys(config('database.connections')); - foreach ($connections as $conn) { - $this->startDbTransaction($conn); - } + $this->startDbTransaction(); $this->setLaravelConfigs($rulesToApply['config'] ?? []); } @@ -151,11 +147,7 @@ private function setLaravelConfigs(array $config) */ private function finish() { - // Stop transactions for all connections since we started all of them. - $connections = array_keys(config('database.connections')); - foreach ($connections as $conn) { - $this->endDbTransaction($conn); - } + $this->endDbTransaction(); } /** diff --git a/src/Extracting/Strategies/Responses/UseApiResourceTags.php b/src/Extracting/Strategies/Responses/UseApiResourceTags.php index 4d8f7ddf..c333c961 100644 --- a/src/Extracting/Strategies/Responses/UseApiResourceTags.php +++ b/src/Extracting/Strategies/Responses/UseApiResourceTags.php @@ -173,9 +173,7 @@ private function getClassToBeTransformedAndAttributes(array $tags): array */ protected function instantiateApiResourceModel(string $type, array $factoryStates = [], array $relations = []) { - $connection = app($type)->getConnectionName(); - - $this->startDbTransaction($connection); + $this->startDbTransaction(); try { // Try Eloquent model factory @@ -214,7 +212,7 @@ protected function instantiateApiResourceModel(string $type, array $factoryState } } } finally { - $this->endDbTransaction($connection); + $this->endDbTransaction(); } return $instance; diff --git a/src/Extracting/Strategies/Responses/UseTransformerTags.php b/src/Extracting/Strategies/Responses/UseTransformerTags.php index bdf4dafd..01c25d20 100644 --- a/src/Extracting/Strategies/Responses/UseTransformerTags.php +++ b/src/Extracting/Strategies/Responses/UseTransformerTags.php @@ -162,9 +162,7 @@ private function getClassToBeTransformed(array $tags, ReflectionFunctionAbstract protected function instantiateTransformerModel(string $type, array $factoryStates = [], array $relations = []) { - $connection = app($type)->getConnectionName(); - - $this->startDbTransaction($connection); + $this->startDbTransaction(); try { // try Eloquent model factory @@ -204,7 +202,7 @@ protected function instantiateTransformerModel(string $type, array $factoryState } } } finally { - $this->endDbTransaction($connection); + $this->endDbTransaction(); } return $instance; From dcf8c06828ea3459305511bbe6209027729606c3 Mon Sep 17 00:00:00 2001 From: hendrikbl Date: Thu, 7 May 2020 14:56:48 +0200 Subject: [PATCH 5/7] fixed linter errors --- src/Extracting/DatabaseTransactionHelpers.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Extracting/DatabaseTransactionHelpers.php b/src/Extracting/DatabaseTransactionHelpers.php index 8c0e2720..cb2407cd 100644 --- a/src/Extracting/DatabaseTransactionHelpers.php +++ b/src/Extracting/DatabaseTransactionHelpers.php @@ -7,8 +7,6 @@ trait DatabaseTransactionHelpers { /** - * @param string $connection - * * @return void */ private function startDbTransaction() @@ -24,8 +22,6 @@ private function startDbTransaction() } /** - * @param string $connection - * * @return void */ private function endDbTransaction() From 3d0b34f93e3d05e3df5cd5f2e76efb632fcd1c19 Mon Sep 17 00:00:00 2001 From: Shalvah Date: Thu, 7 May 2020 23:46:04 +0100 Subject: [PATCH 6/7] Update tests/Fixtures/TestModel.php --- tests/Fixtures/TestModel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Fixtures/TestModel.php b/tests/Fixtures/TestModel.php index cddfef82..141eaef0 100644 --- a/tests/Fixtures/TestModel.php +++ b/tests/Fixtures/TestModel.php @@ -9,7 +9,7 @@ * * @author Tobias van Beek */ -class TestModel extends Model +class TestModel { public $id = 1; From f3e2c4744150a60b9817677d7c4a91d55a51f3d9 Mon Sep 17 00:00:00 2001 From: Shalvah Date: Fri, 8 May 2020 11:25:59 +0100 Subject: [PATCH 7/7] Update TestModel.php --- tests/Fixtures/TestModel.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Fixtures/TestModel.php b/tests/Fixtures/TestModel.php index 141eaef0..ee57523b 100644 --- a/tests/Fixtures/TestModel.php +++ b/tests/Fixtures/TestModel.php @@ -2,8 +2,6 @@ namespace Knuckles\Scribe\Tests\Fixtures; -use Illuminate\Database\Eloquent\Model; - /** * A demo test model. *