Автоматически создаваемые коллекции

Не смотря на то, что есть официальная документация, я постараюсь кратко привести пару примеров.

Вариант 1

  1. все классы наследуемые AbstractExport будут помечены тегом 'rabbitmq.exporters'
  2. все сервисы помеченные тегом '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 как сервис предоставляющий данные.

Вариант 2

  1. все классы имплементирующие DataExporterInterface будут помечены тегом my_tag_name.exporters
  2. все сервисы помеченные тегом my_tag_name.exporters будут переданы в ResponseListener
services:
    _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;
    }
}

Удачки.

Источники: 1 - 2 - 3 - 4


17.10.2010 15:52

Комментарии

Комментариев пока нет.


Copyrights © 2007 - 2026 YaPro.Ru