Plugins: Registering Services
We anticipate registering services on to the Auryn\Injector
being one of the most common use cases for Plugins. Labrador
highly encourages libraries to be built that can work with any Amp project. The InjectorAwarePlugin
is simply some
minimal glue to put your functionality into Labrador's ecosystem.
Labrador does not provide its own container implementation, instead relying on the excellent Auryn library. If you've never used Auryn before it is highly recommended you check out the documentation before continuing with this guide.
Implementing InjectorAwarePlugin
In our example we're going to assume there's a Acme\Foo\BarService
that is an interface describing some functionality
provided by your library. There's also a Acme\Foo\StandardBarService
which acts as the default, out-of-the-box
implementation for the BarService
. Our plugin should ensure that only 1 instance of BarService
is ever created and
if you type-hint against BarService
you should receive the StandardBarService
implementation.
<?php
namespace Acme\Foo;
use Cspray\Labrador\Plugin\InjectorAwarePlugin;
use Auryn\Injector;
final class BarServicePlugin implements InjectorAwarePlugin {
public function wireObjectGraph(Injector $injector) : void {
$injector->share(BarService::class);
$injector->alias(BarService::class, StandardBarService::class);
}
}
That's all there is to it! Obviously this is a simple example, your object graph may need much more advanced configuration. Fortunately Auryn is incredibly powerful and should be able to handle anything you might need from it. Check out the Auryn documentation for more details.
Not for your Application dependencies
The InjectorAwarePlugin
is great if your functionality is very modular and can be used by different types of Labrador
applications. This plugin type is not suitable for the dependencies your Application
requires directly. It also
isn't well suited to dependencies that are overly coupled to your Application
and wouldn't work easily in other Labrador
applications. In these type of use cases you should take a look at Creating Your DependencyGraph.
Next Steps
It's likely you'll want to respond to some events that are triggered by Labrador. Check out the next guide, Plugins: Handling Events, to see how to attach listeners to the event emitter.