From f57735ed5c8c1cf1f2be17d025aec52612930c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 20 Jun 2023 09:17:00 +0000 Subject: [PATCH 1/6] Add transaction class --- src/App.php | 47 +++++++++++++++++++----------------- src/Transaction.php | 59 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 src/Transaction.php diff --git a/src/App.php b/src/App.php index 26376734..272feeb6 100755 --- a/src/App.php +++ b/src/App.php @@ -551,7 +551,7 @@ public function match(Request $request, bool $fresh = false): ?Route * @param Route $route * @param Request $request */ - public function execute(Route $route, Request $request): static + public function execute(Transaction $transaction, Route $route, Request $request): static { $keys = []; $arguments = []; @@ -571,7 +571,7 @@ public function execute(Route $route, Request $request): static if ($route->getHook()) { foreach (self::$init as $hook) { // Global init hooks if (in_array('*', $hook->getGroups())) { - $arguments = $this->getArguments($hook, $values, $request->getParams()); + $arguments = $this->getArguments($transaction, $hook, $values, $request->getParams()); \call_user_func_array($hook->getAction(), $arguments); } } @@ -580,13 +580,13 @@ public function execute(Route $route, Request $request): static foreach ($groups as $group) { foreach (self::$init as $hook) { // Group init hooks if (in_array($group, $hook->getGroups())) { - $arguments = $this->getArguments($hook, $values, $request->getParams()); + $arguments = $this->getArguments($transaction, $hook, $values, $request->getParams()); \call_user_func_array($hook->getAction(), $arguments); } } } - $arguments = $this->getArguments($route, $values, $request->getParams()); + $arguments = $this->getArguments($transaction, $route, $values, $request->getParams()); // Call the callback with the matched positions as params if ($route->getIsActive()) { @@ -599,7 +599,7 @@ public function execute(Route $route, Request $request): static foreach (self::$shutdown as $hook) { // Group shutdown hooks /** @var Hook $hook */ if (in_array($group, $hook->getGroups())) { - $arguments = $this->getArguments($hook, $values, $request->getParams()); + $arguments = $this->getArguments($transaction, $hook, $values, $request->getParams()); \call_user_func_array($hook->getAction(), $arguments); } } @@ -609,7 +609,7 @@ public function execute(Route $route, Request $request): static foreach (self::$shutdown as $hook) { // Group shutdown hooks /** @var Hook $hook */ if (in_array('*', $hook->getGroups())) { - $arguments = $this->getArguments($hook, $values, $request->getParams()); + $arguments = $this->getArguments($transaction, $hook, $values, $request->getParams()); \call_user_func_array($hook->getAction(), $arguments); } } @@ -622,7 +622,7 @@ public function execute(Route $route, Request $request): static /** @var Hook $error */ if (in_array($group, $error->getGroups())) { try { - $arguments = $this->getArguments($error, $values, $request->getParams()); + $arguments = $this->getArguments($transaction, $error, $values, $request->getParams()); \call_user_func_array($error->getAction(), $arguments); } catch (\Throwable $e) { throw new Exception('Error handler had an error: '.$e->getMessage(), 500, $e); @@ -635,7 +635,7 @@ public function execute(Route $route, Request $request): static /** @var Hook $error */ if (in_array('*', $error->getGroups())) { try { - $arguments = $this->getArguments($error, $values, $request->getParams()); + $arguments = $this->getArguments($transaction, $error, $values, $request->getParams()); \call_user_func_array($error->getAction(), $arguments); } catch (\Throwable $e) { throw new Exception('Error handler had an error: '.$e->getMessage(), 500, $e); @@ -657,7 +657,7 @@ public function execute(Route $route, Request $request): static * * @throws Exception */ - protected function getArguments(Hook $hook, array $values, array $requestParams): array + protected function getArguments(Transaction $transaction, Hook $hook, array $values, array $requestParams): array { $arguments = []; foreach ($hook->getParams() as $key => $param) { // Get value from route or request object @@ -681,7 +681,7 @@ protected function getArguments(Hook $hook, array $values, array $requestParams) } if ($paramExists) { - $this->validate($key, $param, $value); + $this->validate($transaction, $key, $param, $value); } } @@ -690,7 +690,7 @@ protected function getArguments(Hook $hook, array $values, array $requestParams) } foreach ($hook->getInjections() as $key => $injection) { - $arguments[$injection['order']] = $this->getResource($injection['name']); + $arguments[$injection['order']] = $transaction->getResource($injection['name']); } return $arguments; @@ -707,17 +707,20 @@ protected function getArguments(Hook $hook, array $values, array $requestParams) */ public function run(Request $request, Response $response): static { - $this->resources['request'] = $request; - $this->resources['response'] = $response; + $transaction = new Transaction(); - self::setResource('request', function () use ($request) { + $transaction->setResource('request', function () use ($request) { return $request; }); - self::setResource('response', function () use ($response) { + $transaction->setResource('response', function () use ($response) { return $response; }); + foreach (self::$resourcesCallbacks as $name => $value) { + $transaction->setResource($name, $value['callback'], $value['injections']); + } + /* * Re-order array * @@ -767,14 +770,14 @@ public function run(Request $request, Response $response): static } if (null !== $route) { - return $this->execute($route, $request); + return $this->execute($transaction, $route, $request); } elseif (self::REQUEST_METHOD_OPTIONS == $method) { try { foreach ($groups as $group) { foreach (self::$options as $option) { // Group options hooks /** @var Hook $option */ if (in_array($group, $option->getGroups())) { - \call_user_func_array($option->getAction(), $this->getArguments($option, [], $request->getParams())); + \call_user_func_array($option->getAction(), $this->getArguments($transaction, $option, [], $request->getParams())); } } } @@ -782,7 +785,7 @@ public function run(Request $request, Response $response): static foreach (self::$options as $option) { // Global options hooks /** @var Hook $option */ if (in_array('*', $option->getGroups())) { - \call_user_func_array($option->getAction(), $this->getArguments($option, [], $request->getParams())); + \call_user_func_array($option->getAction(), $this->getArguments($transaction, $option, [], $request->getParams())); } } } catch (\Throwable $e) { @@ -792,7 +795,7 @@ public function run(Request $request, Response $response): static self::setResource('error', function () use ($e) { return $e; }); - \call_user_func_array($error->getAction(), $this->getArguments($error, [], $request->getParams())); + \call_user_func_array($error->getAction(), $this->getArguments($transaction, $error, [], $request->getParams())); } } } @@ -802,7 +805,7 @@ public function run(Request $request, Response $response): static self::setResource('error', function () { return new Exception('Not Found', 404); }); - \call_user_func_array($error->getAction(), $this->getArguments($error, [], $request->getParams())); + \call_user_func_array($error->getAction(), $this->getArguments($transaction, $error, [], $request->getParams())); } } } @@ -822,7 +825,7 @@ public function run(Request $request, Response $response): static * * @throws Exception */ - protected function validate(string $key, array $param, mixed $value): void + protected function validate(Transaction $transaction, string $key, array $param, mixed $value): void { if ($param['optional'] && \is_null($value)) { return; @@ -831,7 +834,7 @@ protected function validate(string $key, array $param, mixed $value): void $validator = $param['validator']; // checking whether the class exists if (\is_callable($validator)) { - $validator = \call_user_func_array($validator, $this->getResources($param['injections'])); + $validator = \call_user_func_array($validator, $transaction->getResources($param['injections'])); } if (!$validator instanceof Validator) { // is the validator object an instance of the Validator class diff --git a/src/Transaction.php b/src/Transaction.php new file mode 100644 index 00000000..50dc29a9 --- /dev/null +++ b/src/Transaction.php @@ -0,0 +1,59 @@ +id = $this->unique(); + $this->resourcesCallbacks = []; + } + + public function setResource(string $name, callable $callback, array $injections = []): void + { + if ($name === 'utopia') { + throw new Exception("'utopia' is a reserved keyword.", 500); + } + + $this->resourcesCallbacks[$name] = ['callback' => $callback, 'injections' => $injections]; + } + + public function getResource(string $name): mixed + { + if (! \array_key_exists($name, $this->resourcesCallbacks)) { + throw new Exception('Failed to find resource: "'.$name.'"'); + } + + return \call_user_func_array( + $this->resourcesCallbacks[$name]['callback'], + $this->getResources($this->resourcesCallbacks[$name]['injections']) + ); + } + + public function getResources(array $list): array + { + $resources = []; + + foreach ($list as $name) { + $resources[$name] = $this->getResource($name); + } + + return $resources; + } + + protected static function unique(int $padding = 7): string + { + $uniqid = \uniqid(); + + if ($padding > 0) { + $bytes = \random_bytes(\ceil($padding / 2)); // one byte expands to two chars + $uniqid .= \substr(\bin2hex($bytes), 0, $padding); + } + + return $uniqid; + } +} \ No newline at end of file From 0af2dce0bf7a52dc96b563d672f04d483cfa42c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 20 Jun 2023 09:34:35 +0000 Subject: [PATCH 2/6] Add internal resources to transaction --- src/App.php | 10 ++++++++++ src/Transaction.php | 4 ---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/App.php b/src/App.php index 272feeb6..c11ffa71 100755 --- a/src/App.php +++ b/src/App.php @@ -721,6 +721,16 @@ public function run(Request $request, Response $response): static $transaction->setResource($name, $value['callback'], $value['injections']); } + $utopia = $this; + $transaction->setResource('utopia', function () use ($utopia) { + return $utopia; + }); + + $route = $this->match($request); + $transaction->setResource('route', function () use ($route) { + return $route; + }); + /* * Re-order array * diff --git a/src/Transaction.php b/src/Transaction.php index 50dc29a9..cc152098 100644 --- a/src/Transaction.php +++ b/src/Transaction.php @@ -15,10 +15,6 @@ public function __construct() public function setResource(string $name, callable $callback, array $injections = []): void { - if ($name === 'utopia') { - throw new Exception("'utopia' is a reserved keyword.", 500); - } - $this->resourcesCallbacks[$name] = ['callback' => $callback, 'injections' => $injections]; } From f8a7f84ab6ca4dec4529c7819df29165266116f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 20 Jun 2023 09:38:16 +0000 Subject: [PATCH 3/6] Add error resource to transaction --- src/App.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/App.php b/src/App.php index c11ffa71..d713329a 100755 --- a/src/App.php +++ b/src/App.php @@ -616,6 +616,7 @@ public function execute(Transaction $transaction, Route $route, Request $request } } catch (\Throwable $e) { self::setResource('error', fn () => $e); + $transaction->setResource('error', fn () => $e); foreach ($groups as $group) { foreach (self::$errors as $error) { // Group error hooks @@ -805,6 +806,9 @@ public function run(Request $request, Response $response): static self::setResource('error', function () use ($e) { return $e; }); + $transaction->setResource('error', function () use ($e) { + return $e; + }); \call_user_func_array($error->getAction(), $this->getArguments($transaction, $error, [], $request->getParams())); } } @@ -815,6 +819,9 @@ public function run(Request $request, Response $response): static self::setResource('error', function () { return new Exception('Not Found', 404); }); + $transaction->setResource('error', function () { + return new Exception('Not Found', 404); + }); \call_user_func_array($error->getAction(), $this->getArguments($transaction, $error, [], $request->getParams())); } } From 2f4799ac1753c69825e4e99c4c97c90a1a0e6089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Mon, 7 Aug 2023 12:06:55 +0000 Subject: [PATCH 4/6] Fix tests --- src/App.php | 81 ++++++++++++--------------------------------- src/Transaction.php | 28 +++++++++++----- tests/AppTest.php | 63 ++++++++++++++++++++++++----------- 3 files changed, 84 insertions(+), 88 deletions(-) mode change 100644 => 100755 src/Transaction.php diff --git a/src/App.php b/src/App.php index 41c620be..05b7c8a2 100755 --- a/src/App.php +++ b/src/App.php @@ -298,54 +298,6 @@ public static function setMode(string $value): void self::$mode = $value; } - /** - * If a resource has been created return it, otherwise create it and then return it - * - * @param string $name - * @param bool $fresh - * @return mixed - * - * @throws Exception - */ - public function getResource(string $name, bool $fresh = false): mixed - { - if ($name === 'utopia') { - return $this; - } - - if (!\array_key_exists($name, $this->resources) || $fresh || self::$resourcesCallbacks[$name]['reset']) { - if (!\array_key_exists($name, self::$resourcesCallbacks)) { - throw new Exception('Failed to find resource: "' . $name . '"'); - } - - $this->resources[$name] = \call_user_func_array( - self::$resourcesCallbacks[$name]['callback'], - $this->getResources(self::$resourcesCallbacks[$name]['injections']) - ); - } - - self::$resourcesCallbacks[$name]['reset'] = false; - - return $this->resources[$name]; - } - - /** - * Get Resources By List - * - * @param array $list - * @return array - */ - public function getResources(array $list): array - { - $resources = []; - - foreach ($list as $name) { - $resources[$name] = $this->getResource($name); - } - - return $resources; - } - /** * Set a new resource callback * @@ -528,7 +480,7 @@ public function execute(Transaction $transaction, Route $route, Request $request } } catch (\Throwable $e) { self::setResource('error', fn () => $e); - $transaction->setResource('error', fn () => $e); + $transaction->setResource('error', fn () => $e); foreach ($groups as $group) { foreach (self::$errors as $error) { // Group error hooks @@ -600,16 +552,7 @@ protected function getArguments(Transaction $transaction, Hook $hook, array $val return $arguments; } - /** - * Run - * - * This is the place to initialize any pre routing logic. - * This is where you might want to parse the application current URL by any desired logic - * - * @param Request $request - * @param Response $response - */ - public function run(Request $request, Response $response): static + public function createTransaction(Request $request, Response $response) { $transaction = new Transaction(); @@ -635,6 +578,26 @@ public function run(Request $request, Response $response): static return $route; }); + $transaction->setResource('transaction', function () use ($transaction) { + return $transaction; + }); + + return $transaction; + } + + /** + * Run + * + * This is the place to initialize any pre routing logic. + * This is where you might want to parse the application current URL by any desired logic + * + * @param Request $request + * @param Response $response + */ + public function run(Request $request, Response $response): static + { + $transaction = $this->createTransaction($request, $response); + $method = $request->getMethod(); $route = $this->match($request); $groups = ($route instanceof Route) ? $route->getGroups() : []; diff --git a/src/Transaction.php b/src/Transaction.php old mode 100644 new mode 100755 index cc152098..5198a9cb --- a/src/Transaction.php +++ b/src/Transaction.php @@ -6,11 +6,13 @@ class Transaction { protected string $id; protected array $resourcesCallbacks; + protected array $resources; public function __construct() { $this->id = $this->unique(); $this->resourcesCallbacks = []; + $this->resources = []; } public function setResource(string $name, callable $callback, array $injections = []): void @@ -18,16 +20,24 @@ public function setResource(string $name, callable $callback, array $injections $this->resourcesCallbacks[$name] = ['callback' => $callback, 'injections' => $injections]; } - public function getResource(string $name): mixed + public function getResource(string $name, bool $fresh = false): mixed { - if (! \array_key_exists($name, $this->resourcesCallbacks)) { - throw new Exception('Failed to find resource: "'.$name.'"'); + if ($name === 'transaction') { + return $this; } - return \call_user_func_array( - $this->resourcesCallbacks[$name]['callback'], - $this->getResources($this->resourcesCallbacks[$name]['injections']) - ); + if (!\array_key_exists($name, $this->resources) || $fresh) { + if (!\array_key_exists($name, $this->resourcesCallbacks)) { + throw new Exception('Failed to find resource: "' . $name . '"'); + } + + $this->resources[$name] = \call_user_func_array( + $this->resourcesCallbacks[$name]['callback'], + $this->getResources($this->resourcesCallbacks[$name]['injections']) + ); + } + + return $this->resources[$name]; } public function getResources(array $list): array @@ -46,10 +56,10 @@ protected static function unique(int $padding = 7): string $uniqid = \uniqid(); if ($padding > 0) { - $bytes = \random_bytes(\ceil($padding / 2)); // one byte expands to two chars + $bytes = \random_bytes((int) \ceil($padding / 2)); // one byte expands to two chars $uniqid .= \substr(\bin2hex($bytes), 0, $padding); } return $uniqid; } -} \ No newline at end of file +} diff --git a/tests/AppTest.php b/tests/AppTest.php index 5f08054a..fecf24b1 100755 --- a/tests/AppTest.php +++ b/tests/AppTest.php @@ -83,17 +83,21 @@ public function testCanGetResources(): void App::setResource('first', fn ($second) => "first-{$second}", ['second']); App::setResource('second', fn () => 'second'); - $second = $this->app->getResource('second'); - $first = $this->app->getResource('first'); + $request = new Request(); + $response = new Response(); + $transaction = $this->app->createTransaction($request, $response); + + $second = $transaction->getResource('second'); + $first = $transaction->getResource('first'); $this->assertEquals('second', $second); $this->assertEquals('first-second', $first); - $resource = $this->app->getResource('rand'); + $resource = $transaction->getResource('rand'); $this->assertNotEmpty($resource); - $this->assertEquals($resource, $this->app->getResource('rand')); - $this->assertEquals($resource, $this->app->getResource('rand')); - $this->assertEquals($resource, $this->app->getResource('rand')); + $this->assertEquals($resource, $transaction->getResource('rand')); + $this->assertEquals($resource, $transaction->getResource('rand')); + $this->assertEquals($resource, $transaction->getResource('rand')); // Default Params $route = new Route('GET', '/path'); @@ -107,7 +111,7 @@ public function testCanGetResources(): void }); \ob_start(); - $this->app->execute($route, new Request(), new Response()); + $this->app->execute($transaction, $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -117,7 +121,12 @@ public function testCanGetResources(): void public function testCanExecuteRoute(): void { App::setResource('rand', fn () => rand()); - $resource = $this->app->getResource('rand'); + + $request = new Request(); + $response = new Response(); + $transaction = $this->app->createTransaction($request, $response); + + $resource = $transaction->getResource('rand'); $this->app ->error() @@ -137,7 +146,7 @@ public function testCanExecuteRoute(): void }); \ob_start(); - $this->app->execute($route, new Request(), new Response()); + $this->app->execute($transaction, $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -161,7 +170,9 @@ public function testCanExecuteRoute(): void \ob_start(); $request = new UtopiaRequestTest(); $request::_setParams(['x' => 'param-x', 'y' => 'param-y', 'z' => 'param-z']); - $this->app->execute($route, $request, new Response()); + $response = new Response(); + $transaction->setResource('request', fn () => $request); + $this->app->execute($transaction, $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -181,7 +192,8 @@ public function testCanExecuteRoute(): void \ob_start(); $request = new UtopiaRequestTest(); $request::_setParams(['x' => 'param-x', 'y' => 'param-y']); - $this->app->execute($route, $request, new Response()); + $response = new Response(); + $this->app->execute($this->app->createTransaction($request, $response), $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -253,7 +265,8 @@ public function testCanExecuteRoute(): void \ob_start(); $request = new UtopiaRequestTest(); $request::_setParams(['x' => 'param-x', 'y' => 'param-y']); - $this->app->execute($route, $request, new Response()); + $transaction->setResource('request', fn () => $request); + $this->app->execute($transaction, $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -262,7 +275,8 @@ public function testCanExecuteRoute(): void \ob_start(); $request = new UtopiaRequestTest(); $request::_setParams(['x' => 'param-x', 'y' => 'param-y']); - $this->app->execute($homepage, $request, new Response()); + $transaction->setResource('request', fn () => $request); + $this->app->execute($transaction, $homepage, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -292,7 +306,9 @@ public function testCanAddAndExecuteHooks() }); \ob_start(); - $this->app->execute($route, new Request(), new Response()); + $request = new Request(); + $response = new Response(); + $this->app->execute($this->app->createTransaction($request, $response), $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -308,7 +324,9 @@ public function testCanAddAndExecuteHooks() }); \ob_start(); - $this->app->execute($route, new Request(), new Response()); + $request = new Request(); + $response = new Response(); + $this->app->execute($this->app->createTransaction($request, $response), $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -346,7 +364,9 @@ public function testCanHookThrowExceptions() }); \ob_start(); - $this->app->execute($route, new Request(), new Response()); + $request = new Request(); + $response = new Response(); + $this->app->execute($this->app->createTransaction($request, $response), $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -354,7 +374,9 @@ public function testCanHookThrowExceptions() \ob_start(); $_GET['y'] = 'y-def'; - $this->app->execute($route, new Request(), new Response()); + $request = new Request(); + $response = new Response(); + $this->app->execute($this->app->createTransaction($request, $response), $route, $request, $response); $result = \ob_get_contents(); \ob_end_clean(); @@ -519,9 +541,10 @@ public function testWildcardRoute(): void App::init() ->inject('request') ->inject('response') - ->action(function (Request $request, Response $response) { - $route = $this->app->getRoute(); - App::setResource('myRoute', fn () => $route); + ->inject('route') + ->inject('transaction') + ->action(function (Request $request, Response $response, Route $route, Transaction $transaction) { + $transaction->setResource('myRoute', fn () => $route); if ($request->getURI() === '/init_response') { $response->send('THIS IS RESPONSE FROM INIT!'); From 4ac8e9b1bf73615afd64ffdf81b8837675aadbd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Mon, 7 Aug 2023 13:06:00 +0000 Subject: [PATCH 5/6] Add transaction param --- src/App.php | 10 ++++++++-- tests/AppTest.php | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/App.php b/src/App.php index 05b7c8a2..be3f99d0 100755 --- a/src/App.php +++ b/src/App.php @@ -593,10 +593,16 @@ public function createTransaction(Request $request, Response $response) * * @param Request $request * @param Response $response + * @param ?Transaction $transaction */ - public function run(Request $request, Response $response): static + public function run(Request $request, Response $response, Transaction $transaction = null): static { - $transaction = $this->createTransaction($request, $response); + if(empty($transaction)) { + $transaction = $this->createTransaction($request, $response); + } else { + $transaction->setResource('request', fn () => $request); + $transaction->setResource('response', fn () => $response); + } $method = $request->getMethod(); $route = $this->match($request); diff --git a/tests/AppTest.php b/tests/AppTest.php index fecf24b1..a3a3cd3e 100755 --- a/tests/AppTest.php +++ b/tests/AppTest.php @@ -606,4 +606,36 @@ public function testWildcardRoute(): void $_SERVER['REQUEST_METHOD'] = $method; $_SERVER['REQUEST_URI'] = $uri; } + + public function testRunWithTransaction(): void + { + $method = $_SERVER['REQUEST_METHOD'] ?? null; + $uri = $_SERVER['REQUEST_URI'] ?? null; + + $_SERVER['REQUEST_METHOD'] = 'GET'; + $_SERVER['REQUEST_URI'] = '/transaction-test'; + + $request = new Request(); + $response = new Response(); + $transaction = $this->app->createTransaction($request, $response); + + $transaction->setResource('myResource', fn () => 'myText'); + + App::get('/transaction-test') + ->inject('myResource') + ->inject('response') + ->action(function (mixed $myResource, $response) { + $response->send('Resource: ' . $myResource); + }); + + \ob_start(); + @$this->app->run($request, $response, $transaction); + $result = \ob_get_contents(); + \ob_end_clean(); + + $this->assertEquals('Resource: myText', $result); + + $_SERVER['REQUEST_METHOD'] = $method; + $_SERVER['REQUEST_URI'] = $uri; + } } From e404e9f9be7ff05958dd9e6accd3a2e8993d1897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Mon, 14 Aug 2023 16:06:21 +0200 Subject: [PATCH 6/6] memory leak prevention --- src/App.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/App.php b/src/App.php index be3f99d0..5053b5ad 100755 --- a/src/App.php +++ b/src/App.php @@ -578,10 +578,6 @@ public function createTransaction(Request $request, Response $response) return $route; }); - $transaction->setResource('transaction', function () use ($transaction) { - return $transaction; - }); - return $transaction; }