Service Decoration com Symfony 2/3
The english version: http://www.marcelsud.com/service-decoration-with-symfony-2-3/
Uma das features menos utilizadas do Symfony é o “Service Decoration”. Com essa feature, aplicar o padrão de projeto “Decorator” se torna uma tarefa muito mais simples.
A idéia do Decorator é “adicionar um comportamento a um objeto já existente em tempo de execução”
Veja a classe UserRepository abaixo:
Agora imagine que precisamos que um evento seja disparado toda vez que um usuário for adicionado, mas não queremos acoplar o repositório ao sistema de eventos.
Vamos então utilizar o padrão Decorator e por meio de composição vamos disparar o evento após a criação do usuário:
Repare que a classe UserRepository não sabe da existência da classe DecoratedUserRepository, isso é importante! Agora já é possível utilizar a nova classe onde quiser, mas ainda existe a necessidade de alterar todas as referências a UserRepository para DecoratedUserRepository, e se algum dia for necessário adicionar ou alterar o Decorator, o trabalho de manutenção se torna mais complexo…
E é aí que o Service Decoration do Symfony entra em ação! Veja só o arquivo de configuração dos serviços (services.yml):
O atributo “decorates” da configuração faz com que o serviço original seja sobrescrito pelo decorator. Ou seja, quando o serviço “app.user_repository” for requisitado, o serviço “app.decorated_user_repository” será utilizado, ao invés do original.
Para informações detalhadas de como usar essa feature, dê uma olhada na documentação do Symfony: Service Decoration
Até mais!