Я пытаюсь присвоить результат фильтра «filter» (доступен начиная с Twig 2.10) переменной, чтобы я мог использовать его несколько раз:
{% set filtered = collection|filter(element => element.ok) %}
Но, к сожалению, если я попытаюсь выполнить итерацию несколько раз (с использованием фильтра "length", как такового), я получу ошибку
Невозможно пройти через уже закрытый генератор
после первого. Ошибка совершенно очевидна: «фильтр» на самом деле возвращает генератор (который, я считаю, не может быть повторен несколько раз), а не массив или коллекцию.
Проблема в том, что невозможно написать следующий код, например:
{% if filtered|length > 0 %}
<ul>
{% for element in filtered %}
<li>{{ element }}</li>
{% endfor %}
</ul>
{% endif %}
Этот код вызовет вышеупомянутую ошибку в цикле for.
Вместо использования переменной я мог бы повторно фильтровать исходную коллекцию, но это не кажется оптимальным, если в нем много элементов.
Я также думал о том, чтобы написать свой собственный фильтр, обернуть оригинальный, но я бы жил лучше, если бы мне не пришлось.
Что может быть лучше? Следует ли считать это ошибкой в Twig (в этом случае я открою проблему в репо)?
Обратите внимание, что https://github.com/dpolac/twig-lambda не демонстрирует это странное поведение, но не совместимо с Twig 2.10.
Спасибо