I have a simple interface, PurgerInterface that has the methods needed to purge items from a cache backend (Varnish or Fastly). I have some custom configuration (standard system.xml stuff) that allows an admin to decide which backend they'd like to use (Varnish or Fastly).
I also have an Observer that listens to various events and will purge the appropriate caches. Here is the issue: I would like to inject, in my observer constructor, this purger interface like so:
public function __construct( CacheConfig $config, \Psr\Log\LoggerInterface $logger, PurgerInterface $purger) { ....
Now, the issue is that the concrete implementation of the PurgerInterface that I'd like injected is dependent on a configuration. If the Varnish backend is selected, I'd like VarnishPurger injected. If Fastly is selected, I'd like FastlyPurger.
Now, I'm familiar with other frameworks where you are able to dynamically bind items in the "service container" (I'm thinking Laravel here). Basically the logic / code controlling dependency injection can be interacted with, so when the container asks for a PurgerInterface I can run some code to check which concrete class I should return, and that is the class that is injected.
So, is this possible?