#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, но теперь я страдаю, потому что я подробно проверил операцию.