Skip to content

Commit 7996ee1

Browse files
committed
update
1 parent 82d7481 commit 7996ee1

4 files changed

Lines changed: 142 additions & 112 deletions

File tree

README.md

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,16 @@ Groups are designed to be actions that run during the lifecycle of requests to e
217217

218218
### Resources
219219

220-
Resources allow you to prepare dependencies for requests such as database connection or the user who sent the request. A new instance of a resource is created for every request.
220+
Resources allow you to prepare dependencies for requests such as database connections or shared services. Register application dependencies on the DI container with `set()`. Runtime values such as `request`, `response`, `route`, `error`, and `context` are scoped by `Http` for each request.
221221

222-
Define a resource on the DI container:
222+
Define a dependency on the DI container:
223223

224224
```php
225-
$container->setResource('timing', function() {
225+
use Utopia\DI\Dependency;
226+
227+
$container->set('bootTime', new Dependency([], function () {
226228
return \microtime(true);
227-
});
229+
}));
228230
```
229231

230232
Inject resource into endpoint action:
@@ -233,21 +235,21 @@ Inject resource into endpoint action:
233235
$http = new Http(new Server(), 'America/New_York', $container);
234236

235237
Http::get('/')
236-
->inject('timing')
238+
->inject('bootTime')
237239
->inject('response')
238-
->action(function(float $timing, Response $response) {
239-
$response->send('Request Unix timestamp: ' . \strval($timing));
240+
->action(function(float $bootTime, Response $response) {
241+
$response->send('Process started at: ' . \strval($bootTime));
240242
});
241243
```
242244

243245
Inject resource into a hook:
244246

245247
```php
246248
Http::shutdown()
247-
->inject('timing')
248-
->action(function(float $timing) {
249-
$difference = \microtime(true) - $timing;
250-
\var_dump("Request took: " . $difference . " seconds");
249+
->inject('bootTime')
250+
->action(function(float $bootTime) {
251+
$uptime = \microtime(true) - $bootTime;
252+
\var_dump("Process uptime: " . $uptime . " seconds");
251253
});
252254
```
253255

composer.lock

Lines changed: 75 additions & 61 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Http/Http.php

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
namespace Utopia\Http;
44

5-
use Utopia\DI\Container as DIContainer;
5+
use Utopia\DI\Container;
6+
use Utopia\DI\Dependency;
67
use Utopia\Validator;
78

89
class Http
@@ -38,12 +39,12 @@ class Http
3839
*/
3940
protected Files $files;
4041

41-
protected DIContainer $resourceContainer;
42+
protected Container $resourceContainer;
4243

4344
/**
44-
* @var array<string, array<string, bool>>
45+
* @var array<string, Container>
4546
*/
46-
protected array $resourceNames = [];
47+
protected array $scopedContainers = [];
4748

4849
/**
4950
* Current running mode
@@ -129,14 +130,14 @@ class Http
129130
*
130131
* @param Adapter $server
131132
* @param string $timezone
132-
* @param DIContainer|null $resourceContainer
133+
* @param Container|null $resourceContainer
133134
*/
134-
public function __construct(Adapter $server, string $timezone, ?DIContainer $resourceContainer = null)
135+
public function __construct(Adapter $server, string $timezone, ?Container $resourceContainer = null)
135136
{
136137
\date_default_timezone_set($timezone);
137138
$this->files = new Files();
138139
$this->server = $server;
139-
$this->resourceContainer = $resourceContainer ?? new DIContainer();
140+
$this->resourceContainer = $resourceContainer ?? new Container();
140141
}
141142

142143
/**
@@ -879,7 +880,7 @@ public static function reset(): void
879880
self::$wildcardRoute = null;
880881
}
881882

882-
public function getResourceContainer(): DIContainer
883+
public function getResourceContainer(): Container
883884
{
884885
return $this->resourceContainer;
885886
}
@@ -891,7 +892,11 @@ protected function resolveResource(string $name, string $context = 'utopia', boo
891892
}
892893

893894
try {
894-
return $this->resourceContainer->getResource($name, $context, $fresh);
895+
if ($fresh && $context !== 'utopia') {
896+
unset($this->scopedContainers[$context]);
897+
}
898+
899+
return $this->getContextContainer($context)->get($name);
895900
} catch (\Throwable $e) {
896901
$message = \str_replace('dependency', 'resource', $e->getMessage());
897902

@@ -920,8 +925,7 @@ protected function registerResource(string $name, callable $callback, array $inj
920925
throw new Exception("'utopia' is a reserved keyword.", 500);
921926
}
922927

923-
$this->resourceContainer->setResource($name, $callback, $injections, $context);
924-
$this->resourceNames[$context][$name] = true;
928+
$this->getContextContainer($context)->set($name, new Dependency($injections, $callback));
925929
}
926930

927931
protected function registerRequestResources(Request $request, Response $response, string $context, array $resources = []): void
@@ -933,19 +937,28 @@ protected function registerRequestResources(Request $request, Response $response
933937

934938
protected function refreshResources(string $context): void
935939
{
936-
$resources = \array_unique(\array_merge(
937-
\array_keys($this->resourceNames['utopia'] ?? []),
938-
\array_keys($this->resourceNames[$context] ?? [])
939-
));
940-
941-
foreach ($resources as $resource) {
942-
$this->resourceContainer->refresh($resource, $context);
940+
if ($context === 'utopia') {
941+
return;
943942
}
943+
944+
unset($this->scopedContainers[$context]);
944945
}
945946

946947
protected function purgeResources(string $context): void
947948
{
948-
$this->resourceContainer->purge($context);
949-
unset($this->resourceNames[$context]);
949+
unset($this->scopedContainers[$context]);
950+
}
951+
952+
protected function getContextContainer(string $context = 'utopia'): Container
953+
{
954+
if ($context === 'utopia') {
955+
return $this->resourceContainer;
956+
}
957+
958+
if (!isset($this->scopedContainers[$context])) {
959+
$this->scopedContainers[$context] = $this->resourceContainer->scope();
960+
}
961+
962+
return $this->scopedContainers[$context];
950963
}
951964
}

0 commit comments

Comments
 (0)