basster/symfony-di-extras

为symfony项目提供一些有用的DI相关类

2.0 2019-07-08 07:34 UTC

This package is auto-updated.

Last update: 2024-09-15 17:52:19 UTC


README

Latest Stable Version Total Downloads License pipeline status coverage report SensioLabsInsight

这是一个类和接口的集合,我在许多项目中重复使用,以帮助我在自己的服务中注入常用的服务。

安装

版本2遵循Symfony 4.3的更简单的事件分发方法。

composer req basster/symfony-di-extras

Symfony 4.3之前,请使用

composer req basster/symfony-di-extras:^1.6

EventDispatcherAwareInterface

要将事件分发器注入到服务中,让它实现EventDispatcherAwareInterface。在3.3版本的Symfony中引入了基于接口的服务配置,因此您可以使用它,根据类的类型或实现的接口自动执行di操作。以下是一个示例

# app/config/services.yml or config/services.yaml (Symfony Flex)
services:
  _instanceof:
    Basster\SymfonyDiExtras\Event\EventDispatcherAwareInterface:
      calls:
      - [setEventDispatcher, ['@event_dispatcher']]

如果您不自己实现setEventDispatcher方法,可以use EventDispatcherAwareTrait,它还包含一个小型的便捷方法dispatchEvent(string, Symfony\Component\EventDispatcher\Event)

由于这种(setter)注入使EventDispatcher在实现服务中变为可选,因此您会依赖于使用的di容器,无论服务是否被注入。为了避免在代码中使用if ($this->eventDispatcher) { $this->dispatchEvent(...); }调用造成混乱,我包括了NullDispatcher,它遵循Null Object Pattern并实现了Symfony\Component\EventDispatcher\EventDispatcherInterface

我通常在实现EventDispatcherAwareInterface的类的构造函数中分配它。

示例

<?php

use Basster\SymfonyDiExtras\Event\EventDispatcherAwareInterface;
use Basster\SymfonyDiExtras\Event\EventDispatcherAwareTrait;
use Basster\SymfonyDiExtras\Event\NullDispatcher;

class MyService implements EventDispatcherAwareInterface
{
    use EventDispatcherAwareTrait;
    
    public function __construct() {
        $this->setEventDispatcher(new NullDispatcher());   
    }
}

MessageBusAware

要将消息总线注入到服务中,让它实现MessageBusAwareInterface

# app/config/services.yml or config/services.yaml (Symfony Flex)
services:
  _instanceof:
    Basster\SymfonyDiExtras\Event\MessageBusAware:
      calls:
      - [setMessageBus, ['@message_bus']]

如果您不自己实现setMessageBus方法,可以use MessageBusAwareTrait,它还包含一个小型的便捷方法dispatchMessage(mixed)

由于这种(setter)注入使EventBus在实现服务中变为可选,因此您会依赖于使用的di容器,无论服务是否被注入。为了避免在代码中使用if ($this->messageBus) { $this->messageBus->dispatch(...); }调用造成混乱,我包括了NullBus,它遵循Null Object Pattern并实现了Symfony\Component\Messenger\MessageBusInterface

我通常在实现MessageBusAware的类的构造函数中分配它。

示例

<?php

use Basster\SymfonyDiExtras\Messenger\MessageBusAwareInterface;
use Basster\SymfonyDiExtras\Messenger\MessageBusAwareTrait;
use Basster\SymfonyDiExtras\Messenger\NullBus;

class MyService implements MessageBusAware
{
    use EventDispatcherAwareTrait;
    
    public function __construct() {
        $this->setMessageBus(new NullBus());   
    }
}