basster/symfony-di-extras

Some helpful DI related classes for symfony projects

2.0 2019-07-08 07:34 UTC

This package is auto-updated.

Last update: 2022-10-28 14:25:31 UTC


README

Latest Stable Version Total Downloads License pipeline status coverage report SensioLabsInsight

This is a collection of classes and interfaces which I reuse in many projects to help me injecting frequently used services in my own services.

Installation

Version 2 follows the simpler event dispatching approach of Symfony 4.3.

composer req basster/symfony-di-extras

Prior to Symfony 4.3, please use:

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

EventDispatcherAwareInterface

To inject the event-dispatcher into a service, let it implement the EventDispatcherAwareInterface. With version 3.3 Symfony introduced Interface-based service configuration, so you can utilize it, to automatically perform di-actions based in the type of class/implemented interface. Here's an example:

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

For not implementing the setEventDispatcher method by yourself, you can use the EventDispatcherAwareTrait which also holds a small convenience method dispatchEvent(string, Symfony\Component\EventDispatcher\Event)

Since this kind of (setter) injection makes the EventDispatcher optional on the implementing service, you make yourself dependent of the used di-container, whether the service will be injected or not. To avoid cluttering your own code with if ($this->eventDispatcher) { $this->dispatchEvent(...); } calls, I included the NullDispatcher which follows the Null Object Pattern implementing the Symfony\Component\EventDispatcher\EventDispatcherInterface.

I normally assign it on the constructor of the class implementing the EventDispatcherAwareInterface.

Example:

<?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

To inject the message bus into a service, let it implement the MessageBusAwareInterface.

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

For not implementing the setMessageBus method by yourself, you can use the MessageBusAwareTrait which also holds a small convenience method dispatchMessage(mixed)

Since this kind of (setter) injection makes the EventBus optional on the implementing service, you make yourself dependent of the used di-container, whether the service will be injected or not. To avoid cluttering your own code with if ($this->messageBus) { $this->messageBus->dispatch(...); } calls, I included the NullBus which follows the Null Object Pattern implementing the Symfony\Component\Messenger\MessageBusInterface.

I normally assign it on the constructor of the class implementing the MessageBusAware.

Example:

<?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());   
    }
}