dot-dependency-injection is Dotkernel's dependency injection service.
By providing reusable factories for service and repository injection, it reduces code complexity in projects.
Documentation is available at: https://docs.dotkernel.org/dot-dependency-injection/.
Install dot-dependency-injection by running the following command in your project directory:
composer require dotkernel/dot-dependency-injectionAfter installing, register dot-dependency-injection in your project by adding the below line to your configuration
aggregate (usually: config/config.php):
Dot\DependencyInjection\ConfigProvider::class,You can register services in the service manager using AttributedServiceFactory as seen in the below example:
return [
'factories' => [
ServiceClass::class => AttributedServiceFactory::class,
],
];You can use only the fully qualified class name as the service key
The next step is to add the #[Inject] attribute to the service constructor with the service FQCNs to inject:
use Dot\DependencyInjection\Attribute\Inject;
#[Inject(
App\Srevice\Dependency1::class,
App\Srevice\Dependency2::class,
"config",
)]
public function __construct(
protected App\Srevice\Dependency1 $dep1,
protected App\Srevice\Dependency2 $dep2,
protected array $config
) {
}The #[Inject] attribute is telling AttributedServiceFactory to inject the services specified as parameters.
Valid service names should be provided, as registered in the service manager.
To inject an array value from the service manager, you can use dot notation as below
use Dot\DependencyInjection\Attribute\Inject;
#[Inject(
"config.debug",
)]which will inject $container->get('config')['debug'];.
Even if using dot notation,
AttributedServiceFactorywill check first if a service name exists with that name.
You can register doctrine repositories and inject them using the AttributedRepositoryFactory as below:
return [
'factories' => [
ExampleRepository::class => AttributedRepositoryFactory::class,
],
];The next step is to add the #[Entity] attribute in the repository class.
The name field has to be the fully qualified class name.
Every repository should extend Doctrine\ORM\EntityRepository.
use Api\App\Entity\Example;
use Doctrine\ORM\EntityRepository;
use Dot\DependencyInjection\Attribute\Entity;
#[Entity(name: Example::class)]
class ExampleRepository extends EntityRepository
{
}Dependencies injected via the
#[Entity]/#[Inject]attributes are not cached
Injecting dependencies into property setters are not supported