Не смотря на то, что есть официальная документация, я постараюсь кратко привести пару примеров.
AbstractExport будут помечены тегом 'rabbitmq.exporters''rabbitmq.exporters' будут переданы в ExportersCollectionОбъявляем в config/services.yaml:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
_instanceof:
My\RabbitMq\AbstractExport:
tags: ['rabbitmq.exporters']
My\RabbitMq\ExportersCollection:
arguments:
$exporters: !tagged_iterator rabbitmq.exportersРеализуем коллекцию:
<?php
namespace My\RabbitMq;
/**
* Коллекция всех экспортеров.
*/
final class ExportersCollection implements \IteratorAggregate
{
private iterable $exporters;
public function __construct(iterable $exporters)
{
$this->exporters = $exporters;
}
public function getIterator()
{
foreach ($this->exporters as $exporter) {
yield $exporter;
}
}
}Все, теперь можно инъектить/использовать ExportersCollection как сервис предоставляющий данные.
DataExporterInterface будут помечены тегом my_tag_name.exportersmy_tag_name.exporters будут переданы в ResponseListenerservices:
_defaults:
autowire: true
autoconfigure: true
public: false
App\:
resource: '../../{DataExporter}'
_instanceof:
# services whose classes are instances of CustomInterface will be tagged automatically
App\DataExporter\DataExporterInterface:
tags: [my_tag_name.exporters]
App\EventListener\ResponseListener:
arguments:
$exporters: !tagged_iterator my_tag_name.exporters
tags:
- { name: kernel.event_listener, event: kernel.response }Реализуем инъекцию и обработку:
<?php
namespace App\EventListener;
use App\DataExporter\DataExporterInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
class ResponseListener
{
/**
* @var DataExporterInterface[]
*/
private $exporters;
public function __construct($exporters)
{
$this->exporters = $exporters;
}
public function onKernelResponse(ResponseEvent $event)
{
$response = $event->getResponse();
$response->headers->set('X-HEADER_NAME', json_encode($this->getData(), JSON_UNESCAPED_UNICODE));
}
public function getData(): array
{
$result = [];
foreach ($this->exporters as $exporter) {
$result += $exporter->getData();
}
return $result;
}
}Удачки.
Комментарии
Комментариев пока нет.