#forms #validation #symfony #constraints #assert
#формы #проверка #симфония #ограничения #утверждать
Вопрос:
У меня есть поле под названием «наклонение», которое принимает целые числа от 0 до 90 (градусов).
В инструкции assert я указываю, что тип должен быть целым.
В этом случае я хотел бы отобразить поле в виде виджета выбора, выпадающего списка со значениями в диапазоне от 0 до 90.
Однако я не могу найти способ, чтобы выбор выполнялся как целое число. Каждый раз, когда я пытаюсь отправить форму, появляется ошибка «это поле должно быть типа Integer».
Есть ли какой-либо способ:
пусть комбинация выпадающего списка выбора и assertType(тип=»Целое число»)
работать?
Определение свойства в сущности:
/**
* @ORMColumn(name="inclination", type="integer", nullable=true)
* @AssertNotBlank()
* @AssertMin(limit=0)
* @AssertMax(limit=90)
* @AssertType(type="integer")
*/
private $inclination;
Способ построения поля в форме:
$builder->add('inclination', 'choice', array(
'choices' => $this->getInclinationChoices(),
'empty_value' => 'Choose an option',
));
private function getInclinationChoices()
{
$choices = array();
for($i=0; $i<= 90; $i ) {
$choices[$i] = "$i °";
}
return $choices;
}
Ответ №1:
Не уверен, что это правильный подход Symfony 2, но не могли бы вы принудительно присвоить значение целочисленному типу PHP в методе объекта setInclination()
?
Например:
public function setInclination($inclination)
{
$this->inclination = (int) $inclination;
}
Я воссоздал вашу проблему локально, и это исправление сработало для меня.
Комментарии:
1. Это может сработать, спасибо за совет. Когда я приступлю к рефакторингу, я собираюсь опробовать его. На данный момент я устанавливаю его в качестве ответа, поскольку он работал для вас локально.
2. Это сработало для меня, и это дало мне желаемые результаты. Но я все еще чувствую, что может быть лучший дружественный к Symfony способ сделать это (возможно, группа проверки формы). Я просто еще не нашел его. Надеюсь, у кого-нибудь с большим опытом работы с Symfony есть альтернативное решение, которым можно поделиться с нами.