janmarek/autowiring-bundle

Symfony2 的自动装配包

dev-master 2014-08-06 15:53 UTC

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