Кто-нибудь знает, почему список выбора Symfony ChoiceType сохраняет метки в качестве ключей массива, а не значений?

Кто-нибудь знает, почему список выбора Symfony ChoiceType сохраняет метки в качестве ключей массива, а не значений?

Я посмотрел, но не смог найти причину этого решения. Поскольку метка параметра может содержать множество специальных символов и быть достаточно длинной, в то время как значение выбора в большинстве случаев является либо int, либо небольшой строкой, используемой для типов Enum.

0

Решение

Причина этого связана с тем, как PHP работает с определенными значениями, такими как null и логические значения как ключи массива. Это приведет к противоречивому поведению:

php > $a = [true => 'Yes', false => 'No', null => 'Empty'];
php > var_dump($a);
array(3) {
[1]=>
string(3) "Yes"[0]=>
string(2) "No"[""]=>
string(8) "Empty"}

php > $a = [false => 'Empty', 0 => 'No', 1 => 'Yes', 2 => 'Maybe'];
php > var_dump($a);
array(3) {
[0]=>
string(2) "No"[1]=>
string(3) "Yes"[2]=>
string(5) "Maybe"}

Как вы можете видеть во втором примере, это может даже привести к случайной перезаписи ключей. Чтобы избежать этих проблем, Symfony решил обратить значение / отображение метки к метке / значению, поскольку метки почти всегда являются строками и, следовательно, могут обрабатываться более надежно, чем значения.

Если у вас возникли проблемы с длинными именами меток, вы можете использовать короткие ключи перевода, которые развернуты в длинную версию с использованием компонента перевода.

1

Другие решения

Других решений пока нет …