Ошибка: выбранное вами значение не является допустимым выбором

#php #symfony

#php #symfony

Вопрос:

В настоящее время я обновляю систему, работающую на существующем Symfony 2.3 (в настоящее время 3.0.9), и я проверяю операцию. Я хочу сохранить данные, выбранные в форме, в БД, но некоторые данные, использующие ChoiceType, не могут быть сохранены из-за The value you selected is not a valid choice.

Кажется, что переданные данные совпадают с данными системы до обновления базы данных, но, похоже, они отклонены.

Одна вещь, которая, по-видимому, связана с ошибкой, заключается в том, что я заменил цифры и слова в параметрах в services.yml.

Это связано с тем, что на странице отображалось число, хотя должно было отображаться слово. Не могли бы вы дать мне несколько советов?

Ошибка

 shop_keepRequestMinRank => The value you selected is not a valid choice.
shop_prefId => The value you selected is not a valid choice.
 

Код
ShopController.php

 if ($request-> isMethod('PUT')){
    if ($form->handleRequest($request)->isValid()){
        // save save
        $this->get("admin.shopService")->save($shop);
        $this->get('session')->getFlashBag()->add('success','Saved shop profile.');
        return $this->redirect($this->generateUrl ('ahi_sp_admin_shop_shop_edit'));
        } else {
            $this->get('session')->getFlashBag()->add('error','Could not save shop profile. Please check your entries.');
        }
    }
}
 

Services.yml

 parameters:
#member rank
   amc_member_rank:
       "White": 0
       "Navy": 1
       "Orange": 2
       "Silver": 3
       "Black": 4

   prefectures:
       "Hokkaido": 1
       "Aomiriken": 2
 
 

Parameters.php

 / **
      * Get the prefecture's
      *
      * @return array Prefectures
      * /
     public static function getPrefectures()
     {
         return self::$container->getParameter("prefectures");
     }
      / **
      * Get the key of the prefecture
      *
      * @return array Prefectural key
      * /
     public static function getPrefecturesKeys ()
     {
         return array_keys(self::getPrefectures());
     }
/ **
      * Get AMC membership rank
      *
      * @return array AMC member rank
      * /
     public static function getAmcMemberRank()
     {
         return self::$container->getParameter("amc_member_rank");
     }

     / **
      * Get a key for membership rank
      *
      * @return array member rank key
      * /
     public static function getAmcMemberRankKeys()
     {
         return array_keys(self::getAmcMemberRank());
     }
 

ShopType.php

 // Prefectures
$builder->add("prefId", ChoiceType::class, array(
    "required"=>true,
    "choices"=>Parameters::getParameter("prefectures"),
));

// The lowest rank that can be reserved
$builder->add("keepRequestMinRank", ChoiceType::class, array(
    'choices'=>Parameters::getParameter('amc_member_rank'),
    'expanded'=>false,
    'required'=>true,
));
 

Версия
Cent OS 6.7 PHP 5.6 Symfony3.0.9

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

1. Опубликованный код содержит некоторые синтаксические ошибки. При записи переменных у вас не может быть пробела после $ и имени переменной. Пример: ->save($ shop) должно быть ->save($shop) и $ builder должно быть $builder . Они должны вызывать ошибки синтаксического анализа / синтаксиса.

2. @MerrinK — Предлагая редактирование, не меняйте исходный код. Можно отформатировать код, чтобы он был более читабельным, но не изменять фактический код (например, добавлять пропущенные } ).

3. @MagnusEriksson Спасибо, что указали. Я исправил код. Когда я копировал и вставлял его, был пробел. В реальном коде нет пробелов.

Ответ №1:

В Symfony 2.7 они добавили опцию choices_as_values, поскольку данные, предоставленные в ChoiceType, теперь меняются местами (ключи со значениями)

Для обратной совместимости вы должны установить значение choices_as_values равным false . В долгосрочной перспективе вы должны изменить все свои массивы данных для значений ChoiceType.

См. https://symfony.com/doc/2.7/reference/forms/types/choice.html#choices-as-values

Дополнительный совет: при обновлении основных версий прочитайте UPGRADE.md файл из новой версии и проверьте, нет ли критических изменений (BC). Более того, вы должны были сначала обновиться до symfony 2.8, поскольку это версия, специально созданная для перехода с symfony 2 на 3, и сначала исправить все предупреждения об устаревании.

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

1. Спасибо за ваш комментарий. Изначально не используется Choices_as_values, а также ключ и значение сервисов. yml заменяются во время обновления до версии 3.0, поэтому я думаю, что это не связано с этой ошибкой, но как насчет этого? > Дополнительный совет: вы правы. Я однажды обновил его до 2.8, но теперь я страдаю, потому что я подробно проверил операцию.