basster / symfony-di-extras
为symfony项目提供一些有用的DI相关类
Requires
- php: ^7.1.3
Requires (Dev)
- phpunit/phpunit: ^5.7
- symfony/dependency-injection: ~4.0
- symfony/event-dispatcher: ^4.3.0
- symfony/messenger: ^4.3.0
Suggests
- symfony/dependency-injection: Allows you to use the IterableServiceLocator
- symfony/event-dispatcher: Allows you to use EventDispatcherAwareInterface
- symfony/messenger: Allows you to use MessengerDispatcherAwareInterface
This package is auto-updated.
Last update: 2024-09-15 17:52:19 UTC
README
这是一个类和接口的集合,我在许多项目中重复使用,以帮助我在自己的服务中注入常用的服务。
安装
版本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());
}
}