Как сделать итератор для репозиториев?

Для создания итератора для репозиториев в Symfony, вам потребуется создать собственный класс-итератор, который будет реализовывать интерфейс Iterator. Ваш итератор будет инкапсулировать логику доступа к репозиторию и получения элементов из него.

Для начала, создайте новый класс с именем "RepositoryIterator" (или любое другое имя, которое вам нравится) и укажите, что он реализует интерфейс Iterator. Ваш класс будет выглядеть примерно так:

use DoctrineORMEntityManagerInterface;
use DoctrineORMQueryResultSetMappingBuilder;

class RepositoryIterator implements Iterator
{
    private $em;
    private $class;
    private $queryBuilder;
    private $current;
    private $key;

    public function __construct(EntityManagerInterface $em, string $class)
    {
        $this->em = $em;
        $this->class = $class;
    }

    public function rewind()
    {
        $this->queryBuilder = $this->em->createQueryBuilder()
            ->select('e')
            ->from($this->class, 'e');

        $this->current = $this->queryBuilder->getQuery()
            ->getResult();

        $this->key = 0;
    }

    public function valid()
    {
        return isset($this->current[$this->key]);
    }

    public function current()
    {
        return $this->current[$this->key];
    }

    public function key()
    {
        return $this->key;
    }

    public function next()
    {
        $this->key++;
    }
}

В конструкторе класса вы получаете экземпляр Entity Manager и имя класса, связанного с вашим репозиторием. Затем, в методе rewind(), вы инициализируете ваш запрос и сохраняете первый результат в свойстве $current. В методе valid() вы проверяете, есть ли еще элементы в текущем результате, и если да - возвращаете true. В методах current() и key() вы возвращаете текущий элемент и его ключ соответственно. В методе next() вы просто инкрементируете ключ для перехода к следующему элементу.

Теперь, вы можете использовать ваш итератор следующим образом:

$em = $this->getDoctrine()->getManager();
$iterator = new RepositoryIterator($em, YourEntity::class);

foreach ($iterator as $entity) {
    // Делайте что-то с каждым элементом
}

Вам нужно заменить "YourEntity" на вашу сущность, с которой вы хотите работать.

Вот и все! Вы создали собственный итератор для репозиториев в Symfony, который позволяет вам проходить по результатам запроса и делать что-то с каждым элементом. Помните, что этот код только пример, и вам может понадобиться внести дополнительные изменения в зависимости от вашего случая использования.