janmarek / autowiring-bundle
Symfony2 的自动装配包
dev-master
2014-08-06 15:53 UTC
Requires
Requires (Dev)
- janmarek/mockista: dev-master
- phpunit/phpunit: ~4.1
This package is not auto-updated.
Last update: 2024-09-14 16:29:21 UTC
README
此 Symfony2 包的目的是简化依赖注入容器中服务的配置。
自动装配
在 Symfony 2 中,您需要配置服务构造函数的参数。但我们可以使用类型信息来自动配置服务参数。自动装配使用 PHP 反射来查找服务构造函数的参数及其类型。然后,它搜索容器中可以传递给该参数的类。如果只有一个,自动装配会自动为您配置该参数。否则,将抛出异常,您需要像往常一样手动配置服务。
安装说明
通过 composer 安装
composer require janmarek/autowiring-bundle
在您的应用程序内核中启用包。
// app/AppKernel.php public function registerBundles() { return [ // ... new JanMarek\AutowiringBundle\JanMarekAutowiringBundle(), // ... ]; }
功能
构造函数自动装配
class Foo { public function __construct(Bar $bar) { ... } } class Bar { }
services: service_foo: class: Foo # arguments are configured automatically by types service_bar: class: Bar
设置器自动装配
class ClassWithSetters { public function setObject(Bar $bar) { ... } }
services: withSetters: class: ClassWithSetters calls: - [setObject, []] # argument(s) are autowired
按参数名称设置参数
您可以通过在 PHP 代码中设置服务构造函数或设置器的参数名称来设置某些服务构造函数或设置器的参数。其他参数将自动装配。
class ArgsByName { public function __construct(Foo $foo, $namedArg) { } public function setBarAndSomethingElse(Bar $bar, $somethingElse) { ... } }
parameters: param1: 123 param2: 456 services: service_foo: class: Foo service_bar: class: Bar service_with_args_by_name: class: ArgsByName arguments: namedArg: %param1% # params foo is autowired calls: - [setObject, { somethingElse: %param2% }] # param bar is autowired
通过命名约定猜测类
如果您没有设置服务类,AutowiringBundle 会将服务名称转换为类名,并添加到服务定义中,如果该类存在。转换规则是:下划线名称转换为驼峰式,点用作命名空间分隔符。
services: # class is automatically set to Vendor\NameSpace\ClassName vendor.name_space.class_name:
防止冲突
如果构造函数需要一个服务,并且有多个实现给定接口的服务,自动装配通常不能选择其中一个并抛出异常。
但是,如果您使用前面章节中描述的命名约定命名服务,它将在冲突情况下用作默认服务。
namespace NameSpace; class Foo { public function __construct(Bar $bar) { ... } } class Bar { public function __construct($value) { } }
services: name_space.bar: class: NameSpace\Bar arguments: [123] other_bar: class: NameSpace\Bar arguments: [456] name_space.foo: class: NameSpace\Foo # service name_space.bar is autowired to constructor
许可证
BSD