vanio / vanio-di-extra-bundle
允许使用注解配置依赖注入
v0.1.0
2018-10-27 22:35 UTC
Requires
- php: ^7.0
- doctrine/cache: ^1.6
- symfony/dependency-injection: ^3.0
- symfony/framework-bundle: ^3.0
- vanio/type-parser: ^0.1@dev
Requires (Dev)
- phpunit/phpunit: ^5.5
- vanio/coding-standards: ^0.1@dev
This package is auto-updated.
Last update: 2024-09-16 19:11:39 UTC
README
这是一个 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; } }