Dependency injection – Come iniettare servizi taggati

Tagged services

Per indicare che un servizio svolge un particolare ruolo in Symfony è possibile configurarlo aggiungendo uno o più tags alla sua definizione. Per esempio, etichettando un servizio con il tag twig.extension si indica a Symfony che il servizio deve essere trattato come una estensione di twig.

Questo meccanismo è ampiamente usato in Symfony (vedere qui l’elenco di tutti tag disponibili nel core https://symfony.com/doc/current/reference/dic_tags.html) e può essere personalizzato per le proprie necessità.

Come utilizzarli

Supponiamo di voler costruire una classe in cui vogliamo iniettare una categoria di servizi, per esempio per fornire una serie di regole da applicare in fase di esecuzione.

Per esempio, pensiamo ad una classe che possa applicare due politiche di sconto differenti in base alle caratteristiche del cliente.

Imposteremo le classi in questo modo:

//la classe per scegliere la politica di prezzo da applicare
namespace PoliticaDiSconto;

class PoliticaDiScontoContext
{

    public function __construct(iterable $politicheDiSconto)
    {
        //
    }
}

//le due politiche di sconto da applicare (con relativa interface)
namespace PoliticaDiSconto;
interface ScontoPolicy
{
    public function supports(Cliente $cliente): bool;
    
    public function getPercentualeSconto(): int;
}

namespace PoliticaDiSconto;
class ScontoNormale implements ScontoPolicy
{

    public function supports(Cliente $cliente): bool
    {
        //
    }

    public function getPercentualeSconto(): int
    {
        //
    }
}

namespace PoliticaDiSconto;
class ScontoHappyHour implements ScontoPolicy
{

    public function supports(Cliente $cliente): bool
    {
        //
    }

    public function getPercentualeSconto(): int
    {
        //
    }
}

Le due implementazioni di ScontoPolicy dovranno essere iniettate in ScontoContext. I due servizi dovranno essere taggati, per esempio, con il tag app.politiche_di_sconto



    
        
        
            
        
        
            
        
    


Per iniettarli in PoliticaDiScontoContext sarà a questo punto sufficiente impostare un parametro di tipo tagged nella definizione di servizio di quest’ultima classe.


    

Nicola Fornaciari
Nicola Fornaciari
Articoli: 3

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.