Я использую 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.
Согласно комментарию 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'
),
])
Вы пытались использовать третий аргумент для
ChoiceList::filter? В документации по коду говорится: «$vary: динамические данные, используемые для вычисления уникального хэша при кэшировании обратного вызова».