vanio/vanio-di-extra-bundle

Allows to configure dependency injection using annotations

Installs: 8 604

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 11

Forks: 1

Open Issues: 0

Type:symfony-bundle

v0.1.0 2018-10-27 22:35 UTC

This package is auto-updated.

Last update: 2024-04-16 18:20:49 UTC


README

Build Status Coverage Status PHP7 License

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.

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

/**
 * @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.

/**
 * @Inject("translator", required=false)
 */
public $translator;

Injecting an optional dependency when injecting by type can be achieved using @var annotation.

/**
 * @var TranslatorInterface|null
 * @Inject
 */
public $translator;

Injecting of container parameters is also possible

/**
 * @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.

Installation

Installation can be done as usually using composer. composer require vanio/vanio-di-extra-bundle

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.

// 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;
    }
}