Extension Class
At bare minimum, an extension must have an instance of Zoop\Shard\AbstractExtension
. This class provides all the hooks and configuration required to create your extension. It has these properties, and you can add your own custom configuration properties:
Name | type | description |
---|---|---|
documents | array | An array of document namespaces and directories to register. |
subscribers | array | An array of subscribers, or subscriber service names to register. |
cliCommands | array | An array of cli command service names to register with the doctrine cli. |
cliHelpers | array | An array of cli helper service names to register with the doctrine cli. |
serviceManagerConfig | array | Any service manager configuration. |
dependencies | array | An array of service names of other extensions that must be loaded for this extension to work. |
For example, the Color extension class would look like this:
namespace My\Color; use Zoop\Shard\AbstractExtension; class Extension extends AbstractExtension { protected $subscribers = [ 'subscriber.color.annotationsubscriber' //annotation subscriber to listen to @Color annotation events ]; protected $serviceManagerConfig = [ 'invokables' => [ 'subscriber.color.annotationsubscriber' => 'My\Color\AnnotationSubscriber' //register the annotation subscriber service ] ]; protected $filters = [ 'color' => 'My\Color\Filter' //register filter ]; protected $dependencies = [ 'extension.annotation' => true //require the annotation extension to make annotation events work ]; }
Extension Factory
Create a small factory class to return an instance of your extension. Eg:
namespace My\Color; use Zoop\Shard\AbstractExtensionFactory; use Zend\ServiceManager\ServiceLocatorInterface; class ExtensionFactory extends AbstractExtensionFactory { protected $extensionServiceName = 'my.extension.color'; public function createService(ServiceLocatorInterface $serviceLocator) { return new Extension($this->getConfig($serviceLocator)); } }
Annotation
The color extension is using an annotation, so we need to define that annotation:
namespace My\Color; use Doctrine\Common\Annotations\Annotation; final class Color extends Annotation { const event = 'annotationColor'; }
Annotation Subscriber
Add an annotation subscriber to listen to the annotationColor
event and augment the metadata:
namespace My\Color; use Doctrine\Common\EventSubscriber; use Zoop\Shard\Annotation\AnnotationEventArgs; class AnnotationSubscriber implements EventSubscriber { public function getSubscribedEvents(){ return [Color::event]; } public function annotationColorZones(AnnotationEventArgs $eventArgs) { $eventArgs->getMetadata()->color = $eventArgs->getReflection()->getName(); } }
Filter
Add a filter that can filter by color:
namespace My\Color; use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; use Doctrine\ODM\MongoDB\Query\Filter\BsonFilter; class Filter extends BsonFilter { protected $color; public function setColor($color){ $this->color = $color; } public function addFilterCriteria(ClassMetadata $metadata) { if (isset($metadata->color)) { return array($metadata->color => $this->color); } return array(); } }
Using It
That's it!
Config
Now register and enable you extension when you create a manifest:
$manifest = new Zoop\Shard\Manifest([ ... 'extension_configs' => [ 'my.extension.color' => true ], 'service_manager_config' => [ 'factories' => [ 'my.extension.color' => 'My\Color\ExtensionFactory' ], ] ]);
@Color
Use your @Color
annotation in a document:
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; use My\Color\Color; /** * @ODM\Document */ class DocWithColor { /** * @ODM\String * @Color */ protected $color; ... }
Filter
Use your filter to filter documents by color:
$documentManager->getFilterCollection()->enable('color'); $filter = $documentManager->getFilterCollection()->getFilter('color'); $filter->setColor('blue');