skrz/autowiring-bundle

基于注解的Symfony 4依赖注入容器自动装配

v2.0.0 2018-02-21 22:11 UTC

This package is not auto-updated.

Last update: 2024-09-13 13:44:08 UTC


README

Build Status Quality Score Code Coverage Downloads this Month Latest stable

基于注解的Symfony 4依赖注入容器自动装配

安装

将作为Composer依赖项添加

$ composer require skrz/autowiring-bundle

然后将 SkrzAutowiringBundle 添加到 Symfony Kernel

use Skrz\Bundle\AutowiringBundle\SkrzAutowiringBundle;

class AppKernel
{

    public function registerBundles()
    {
        return [
            ...
            new SkrzAutowiringBundle()
            ...
        ];
    }

}

用法

使用 @Component 注解及其子类,或所谓的 "特征" 来注解您的应用程序组件。预定义的特征包括 @Controller@Repository@Service,例如:

use Skrz\Bundle\AutowiringBundle\Annotation\Controller;

/**
 * @Controller
 */
class HomepageController
{
    ...
}

通过继承 @Component 创建您自己的应用程序特征。

构造函数依赖注入

// services.yml
services:
  Example\HomepageController: ~
namespace Example;

use Skrz\Bundle\AutowiringBundle\Annotation\Controller;

/**
 * @Controller
 */
class HomepageController
{

    /**
     * @var SomeService
     */
    private $someService;

    public function __construct(SomeService $someService)
    {
        $this->someService = $someService;
    }

    ...

}

SomeService 在容器中创建 HomepageController 实例时自动注入。

注意:如果没有在 services.yml 中指定足够的 arguments,则构造函数将 始终 自动注入。如果您真的不想构造函数自动注入,请将服务添加到 ignored_services 配置指令中。

注意:如果您需要指定某些构造函数参数并自动注入其他构造函数参数,则需要按照以下方式配置您的服务

// services.yml
services:
  Example\HomepageController:
    arguments: 
      someParameter: %kernel.whatever%
namespace Example;

use Skrz\Bundle\AutowiringBundle\Annotation\Controller;

/**
 * @Controller
 */
class HomepageController
{

    /**
     * @var SomeService
     */
    private $someService;
    
    /**
     * @var string
     */
    private $someParameter;

    public function __construct(SomeService $someService, $someParameter)
    {
        $this->someService = $someService;
        $this->someParameter = $someParameter;
    }

    ...

}

$someService 参数是自动注入的,而 $someParameter 参数则根据配置注入。

方法依赖注入

// services.yml

services:
  Example\HomepageController: ~
namespace Example;

use Skrz\Bundle\AutowiringBundle\Annotation\Controller;
use Skrz\Bundle\AutowiringBundle\Annotation\Autowired;

/**
 * @Controller
 */
class HomepageController
{

    /**
     * @var SomeService
     */
    private $someService;

    /**
     * @param SomeService $someService
     * @return void
     *
     * @Autowired
     */
    public function setSomeService(SomeService $someService)
    {
        $this->someService = $someService;
    }

    ...

}

属性依赖注入

// services.yml

services:
  Example\HomepageController: ~
namespace Example;

use Skrz\Bundle\AutowiringBundle\Annotation\Controller;
use Skrz\Bundle\AutowiringBundle\Annotation\Autowired;

/**
 * @Controller
 */
class HomepageController
{

    /**
     * @var SomeService
     *
     * @Autowired
     */
    public $someService;

    ...

}

注意:使用属性依赖注入相当上瘾。

属性参数注入

您还可以使用 @Value 注解注入容器参数。

// services.yml

services:
  Example\HomepageController: ~
namespace Example;

use Skrz\Bundle\AutowiringBundle\Annotation\Controller;
use Skrz\Bundle\AutowiringBundle\Annotation\Value;

/**
 * @Controller
 */
class HomepageController
{

    /**
     * @var string
     *
     * @Value("%kernel.root_dir%")
     */
    public $rootDir;

    ...

}

小贴士:始终注入标量值,不要注入数组。当您注入标量值时,容器编译期间会验证它们的存在。

自动扫描

自动扫描是 SkrzAutowiringBundle 1.x 版本的一个功能。然而,由于 Symfony 4.0 的推出,容器原生支持 此功能。因此,它已从包中删除,您应使用 resource 关键字导入服务目录。

// services.yml

services:
  Example\:
    resource: "../path/to/controllers/*Controller.php"
namespace Example;

use Skrz\Bundle\AutowiringBundle\Annotation\Controller;
use Skrz\Bundle\AutowiringBundle\Annotation\Autowired;

/**
 * @Controller
 */
class HomepageController
{

    /**
     * @var SomeService
     *
     * @Autowired
     */
    public $someService;

    ...

}

配置

# container extension key is "autowiring"
autowiring:

  # these service IDs won't be processed by autowiring
  ignored_services:
    # either specify exact service IDs
    - kernel
    - http_kernel

    # or use regular expressions (they must start with "/")
    - /^debug\./
    - /^file/

  # match interfaces to exact services
  preferred_services:
    Psr\Log\LoggerInterface: logger
    Monolog\Logger: logger
    Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface: session.storage.native

  # if you create your own stereotypes, you must add then here
  fast_annotation_checks: [ @Task, @Widget ]

许可证

MIT 许可证。查看 LICENSE 文件。