Фильтрация списка выбора Symfony 5.1

Я использую Symfony 5.1 для фильтрации объекта в типе формы.

->add('ageGroup', EntityType::class, [
    'class' => AgeGroup::class,
    'choice_label' => 'name',
    'choice_filter' => ChoiceList::filter(
        $this,
        function ($ageGroup) {
            if ($ageGroup instanceof AgeGroup) {
                return $ageGroup->getOrganization()->getId() == $this->security->getUser()->getOrganization()->getId();
            }
            return false;
        }
    )
])
->add('room', EntityType::class, [
    'class' => Room::class,
    'choice_label' => 'name',
    'choice_filter' => ChoiceList::filter(
        $this,
        function ($room) {
            if ($room instanceof Room) {
                return $room->getBranch()->getOrganization()->getId() == $this->security->getUser()->getOrganization()->getId();
            }
            return false;
        }
    ),
])

У меня есть интересная проблема. Какой бы ChoiceList::filter ни был первым, он будет работать, но после него не будет работать никакой другой фильтр.

Именно тогда ->add('ageGroup') занял первое место.

Именно тогда ->add('room') занял первое место.

2-й список выбора не вызывается. Совсем.

На самом деле никакой другой ChoiceList::filter не вызывается, если я добавляю больше 1.

https://symfony.com/doc/current/reference/forms/types/choice.html не накладывает ограничений на количество вызовов.

понятно что я так делаю

Я даже не могу предположить, что с ним не так.

Вы пытались использовать третий аргумент для ChoiceList::filter? В документации по коду говорится: «$vary: динамические данные, используемые для вычисления уникального хэша при кэшировании обратного вызова».

Barthy 17.12.2020 20:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
1 222
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод ChoiceList::filter принимает третий аргумент с именем $vary.

Согласно комментарию PHPDoc:

/**
 * @param FormTypeInterface|FormTypeExtensionInterface $formType A form type or type extension configuring a cacheable choice list
 * @param mixed                                        $option   Any pseudo callable, array, string or bool to define a choice list option
 * @param mixed|null                                   $vary     Dynamic data used to compute a unique hash when caching the option
 */

Хеш-функция, используемая в этом методе, использует встроенный в php spl_object_hash() для объекта $formType, что даст один и тот же идентификатор для обоих обратных вызовов. Передайте имя поля (или любое другое уникальное значение) в качестве третьего аргумента:

->add('ageGroup', EntityType::class, [
    'class' => AgeGroup::class,
    'choice_label' => 'name',
    'choice_filter' => ChoiceList::filter(
        $this,
        function ($ageGroup) {
            if ($ageGroup instanceof AgeGroup) {
                return $ageGroup->getOrganization()->getId() == $this->security->getUser()->getOrganization()->getId();
            }
            return false;
        },
        'ageGroup'
    )
])
->add('room', EntityType::class, [
    'class' => Room::class,
    'choice_label' => 'name',
    'choice_filter' => ChoiceList::filter(
        $this,
        function ($room) {
            if ($room instanceof Room) {
                return $room->getBranch()->getOrganization()->getId() == $this->security->getUser()->getOrganization()->getId();
            }
            return false;
        },
        'room'
    ),
])

Другие вопросы по теме