#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'
),
])