https://github.com/utopia-php/di
Lite & fast micro PHP dependency injections library that is **easy to use**.
https://github.com/utopia-php/di
Last synced: about 2 months ago
JSON representation
Lite & fast micro PHP dependency injections library that is **easy to use**.
- Host: GitHub
- URL: https://github.com/utopia-php/di
- Owner: utopia-php
- License: mit
- Created: 2024-03-24T18:16:01.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2026-03-21T07:42:37.000Z (2 months ago)
- Last Synced: 2026-03-21T22:19:49.230Z (2 months ago)
- Language: PHP
- Size: 179 KB
- Stars: 3
- Watchers: 5
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
[](https://github.com/utopia-php/di/actions/workflows/ci.yml)

[](https://discord.gg/GSeTUeA)
Utopia DI is a small PSR-11 compatible dependency injection container with parent-child scopes. It is designed to stay simple while still covering the dependency lifecycle used across the Utopia libraries. This library is maintained by the [Appwrite team](https://appwrite.io).
Although this library is part of the Utopia Framework project it is dependency free, and can be used as standalone with any other PHP project or framework.
## Getting Started
Install using Composer:
```bash
composer require utopia-php/di
```
```php
require_once __DIR__.'/../vendor/autoload.php';
use Utopia\DI\Container;
$di = new Container();
$di->set('age', fn (): int => 25);
$di->set(
'john',
fn (int $age): string => 'John Doe is '.$age.' years old.',
['age']
);
$john = $di->get('john');
```
Dependencies are resolved from the third `set()` argument and passed to the factory in that same order.
Register factories directly and list the dependency IDs they need.
```php
$di->set('config', fn (): array => [
'dsn' => 'mysql:host=localhost;dbname=app',
'username' => 'root',
'password' => 'secret',
]);
$di->set(
'db',
fn (array $config): PDO => new PDO(
$config['dsn'],
$config['username'],
$config['password']
),
['config']
);
```
Factories are resolved once per container instance. A child container behaves in two distinct ways:
- If the child does not define a key, it falls back to the parent and reuses the parent's resolved value.
- If the child defines the same key locally, it resolves and caches its own value without changing the parent.
```php
$counter = 0;
$di->set('requestId', function () use (&$counter): string {
$counter++;
return 'request-'.$counter;
});
$di->get('requestId'); // "request-1"
$child = new Container($di);
$child->get('requestId'); // "request-1" (falls back to the parent cache)
$child->set('requestId', function () use (&$counter): string {
$counter++;
return 'request-'.$counter;
});
$child->get('requestId'); // "request-2" (child now uses its own local definition)
$di->get('requestId'); // "request-1" (parent is unchanged)
```
## System Requirements
Utopia DI requires PHP 8.2 or later. We recommend using the latest PHP version whenever possible.
## More from Utopia
Our ecosystem supports other thin PHP projects aiming to extend the core PHP Utopia libraries.
Each project is focused on solving a single, very simple problem and you can use composer to include any of them in your next project.
You can find all libraries in [GitHub Utopia organization](https://github.com/utopia-php).
## Contributing
All code contributions - including those of people having commit access - must go through a pull request and approved by a core developer before being merged. This is to ensure proper review of all the code.
Fork the project, create a feature branch, and send us a pull request.
You can refer to the [Contributing Guide](https://github.com/utopia-php/di/blob/master/CONTRIBUTING.md) for more info.
For security issues, please email security@appwrite.io instead of posting a public issue in GitHub.
## Copyright and license
The MIT License (MIT) [http://www.opensource.org/licenses/mit-license.php](http://www.opensource.org/licenses/mit-license.php)