, (*1)
A Symfony2/3 Bundle providing an ability to resolve services by type by calling getByType
on service container and lazily inject services or parameters into public properties of classes implementing ContainerAwareInterface
(like controllers, CLI commands or Doctrine fixtures) using Inject
annotation.
JMS DI Extra Bundle has a similar annotation but it covers much more functionality. This bundle is lightweight and does not use AOP., (*2)
Example
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Translation\TranslatorInterface;
use Vanio\DiExtraBundle\Controller;
use Vanio\DiExtraBundle\DependencyInjection\Metadata\Inject;
class HelloController extends Controller
{
/**
* @var TranslatorInterface
* @Inject
*/
public $translator;
/**
* @Route("/hello", name="app_hello")
* @Template
*/
public function helloAction(): array
{
return ['message' => $this->translator->trans('Hello world!')];
}
}
It is also possible to inject a service using it's ID, (*3)
/**
* @Inject("translator")
*/
public $translator;
It is also possible to inject an optional dependency which means that it does not throw exception when the service is not found., (*4)
/**
* @Inject("translator", required=false)
*/
public $translator;
Injecting an optional dependency when injecting by type can be achieved using @var annotation., (*5)
/**
* @var TranslatorInterface|null
* @Inject
*/
public $translator;
Injecting of container parameters is also possible, (*6)
/**
* @Inject("%kernel.cache_dir%/app")
*/
public $cacheDirectory;
All you need to do for using the Inject annotation is to use Vanio\DiExtraBundle\DependencyInjection\ContainerAwareTrait
where you normally use the default Symfony\Component\DependencyInjection\ContainerAwareTrait
.
There is also an abstract Vanio\DiExtraBundle\Controller
you can extend as a shortcut., (*7)
Installation
Installation can be done as usually using composer.
composer require vanio/vanio-di-extra-bundle
, (*8)
Next step is to register this bundle inside your AppKernel
but you also have to tell the Kernel about the new getByType
method by overriding getContainerBaseClass
method., (*9)
// app/AppKernel.php
// ...
use Vanio\DiExtraBundle\DependencyInjection\Container;
class AppKernel extends Kernel
{
// ...
public function registerBundles(): array
{
$bundles = [
// ...
new Vanio\DiExtraBundle\VanioDiExtraBundle,
];
// ...
}
public function getContainerBaseClass(): string
{
return Container::class;
}
}