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

#php #symfony

#php #symfony

Вопрос:

Я использую 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 не накладывает никаких ограничений на то, сколько человек может быть вызвано.

Очевидно, что я делаю это

Я даже не могу начать догадываться, что с этим не так.

Комментарии:

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

Ответ №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
 */
 

Функция хеширования, используемая в этом методе, использует встроенную в spl_object_hash() объект php $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'
    ),
])