PHPackages                             ivanvoitovych/dot-di - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. ivanvoitovych/dot-di

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

ivanvoitovych/dot-di
====================

DI and service provider for PHP. Inspired by .NET DI.

v1.1.4(1y ago)117112MITPHP

Since May 22Pushed 1y ago1 watchersCompare

[ Source](https://github.com/ivanvoitovych/dot-di)[ Packagist](https://packagist.org/packages/ivanvoitovych/dot-di)[ RSS](/packages/ivanvoitovych-dot-di/feed)WikiDiscussions master Synced today

READMEChangelog (6)DependenciesVersions (7)Used By (2)

dot-di
======

[](#dot-di)

Dependency Injection and Service provider for PHP. Inspired by .NET DI.

Usage
-----

[](#usage)

`composer require ivanvoitovych/dot-di`

```
require __DIR__ . '/../vendor/autoload.php';

use DotDi\DependencyInjection\ServiceProvider;
use DotDi\DependencyInjection\ServiceProviderHelper;

$services = new ServiceProvider();
// register a singleton
$services->addSingleton(FooService::class);
// register a transient
$services->addTransient(BarService::class);
// register scoped using interface as a type
$services->addScoped(ITaxService::class, TaxService::class);
$services->addScoped(GenericService::class);
$services->addScoped(UserService::class);

// factory
$serviceProvider->addSingleton(
    IRedisConnector::class,
    function (Config $config) { // params are autoinjected
        return new RedisConnector($config->values['redisDbIndex']);
    }
);

// to auto register everything in the folder (as Scoped, for ex.: controllers)
ServiceProviderHelper::discover($services, ['path/to/your/files']);
```

Using with generics
-------------------

[](#using-with-generics)

```
class GenericService
{
    public function __construct(private string $type, private ?string $dbMap = null, ?int $dbIndex = null)
    {
    }
}
...
// injecting generic type using Inject attribute

class TestService
{
    /**
     *
     * @param GenericService $usersRepository
     * @return void
     */
    public function __construct(
        #[Inject([
            'type' => 'UserEntity',
            'dbMap' => 'UserEntityDbMap'
        ])]
        public GenericService $usersRepository
    ) {
    }
}

// extending generic class
#[Inject([
    'type' => 'UserEntity',
    'dbMap' => 'UserEntityDbMap'
])]
class UserService extends GenericService
{
}
```

Using scope
-----------

[](#using-scope)

```
// creating a scope
$scope = $services->createScope();
// getting a service
$scope->serviceProvider->get(FooService::class);
$scope->serviceProvider->get(ITaxService::class);
// setting up a service for current scope only
$requestScope->serviceProvider->set(HttpContext::class, new HttpContext());
// dispose at the end
$scope->dispose();
```

Useful for swoole or ReactPHP
-----------------------------

[](#useful-for-swoole-or-reactphp)

dot-di is super efficient and memory friendly - no memory leaks.

Use with IDisposable to auto release your resources:

```
