vanio/vanio-di-extra-bundle

允许使用注解配置依赖注入

安装数: 8,676

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 11

分支: 1

开放问题: 0

类型:symfony-bundle

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

This package is auto-updated.

Last update: 2024-09-16 19:11:39 UTC


README

Build Status Coverage Status PHP7 License

这是一个 Symfony2/3 Bundle,它通过在服务容器上调用 getByType 方法来提供通过类型解析服务的能力,并使用 Inject 注解将服务或参数懒加载注入到实现 ContainerAwareInterface 接口的类的公共属性中(如控制器、CLI 命令或 Doctrine 固件)。JMS DI Extra Bundle 有类似的注解,但功能更全面。这个包轻量级,不使用 AOP。

示例

<?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!')];
    }
}

也可以通过服务的 ID 注入服务

/**
 * @Inject("translator")
 */
public $translator;

也可以注入一个可选依赖,这意味着当服务未找到时,它不会抛出异常。

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

使用 @var 注解注入类型时,可以注入可选依赖。

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

也可以注入容器参数

/**
 * @Inject("%kernel.cache_dir%/app")
 */
public $cacheDirectory;

要使用 Inject 注解,你需要在通常使用默认的 Symfony\Component\DependencyInjection\ContainerAwareTrait 的地方使用 Vanio\DiExtraBundle\DependencyInjection\ContainerAwareTrait。还有一个抽象的 Vanio\DiExtraBundle\Controller,你可以扩展它作为快捷方式。

安装

可以使用 composer 通常的方式安装。 composer require vanio/vanio-di-extra-bundle

下一步是在你的 AppKernel 中注册这个包,但你还需要通过重写 getContainerBaseClass 方法来告诉 Kernel 关于新的 getByType 方法。

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