Почему одни поля формы в Symfony2 выставляются в required="required" а другие нет?

Недавно начал плотно знакомиться с Symfony2, до этого долгое время сидел на Kohana, начал делать формы, через FormType, основываясь на готовой Entity создается формочка через FormBuilder и вот загадка - одни поля имеют свойство required="required", а другие почему то нет. В общем особой сложности нет, понимаю что можно всё настроить через валидатор, но эта магия не дает покоя. Ниже код, думаю он больше расскажет
Вот сущность в кратце и поля которые хотелось бы чтобы были required="required"
namespace Acme\UserBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

class User extends BaseUser
{
   .....
    /**
     *
     * @var string
     * 
     * @ORM\Column(name="first_name", type="string", nullable=true)
     */
    protected $firstName;

    /**
     *
     * @var string
     * 
     * @ORM\Column(name="last_name", type="string", nullable=true)
     */
    protected $lastName;
    
    /**
     *
     * @var string
     * 
     * @ORM\Column(name="phone", type="string", nullable=true)
     */
    protected $phone;
   .........

Вот билдер формы
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('phone')
                ->add('first_name')
                ->add('last_name')
                
                ->add('save', 'submit');
    }

Создание формы
$user = $this->get('security.context')->getToken()->getUser();

        $user_profile_form = $this->createForm(new UserProfileType(), $user)
                ->createView();

Вставка в шаблон
{{ form(user_profile_form) }}
и на выходе у нас
<div id="user_profile">
<div>
<label for="user_profile_phone">Phone</label>
<input id="user_profile_phone" type="text" name="user_profile[phone]">
</div>
<div>
<label class="required" for="user_profile_first_name">First name</label>
<input id="user_profile_first_name" type="text" value="Иван" required="required" name="user_profile[first_name]">
</div>
<div>
<label class="required" for="user_profile_last_name">Last name</label>
<input id="user_profile_last_name" type="text" required="required" name="user_profile[last_name]">
</div>
<div>
<input id="user_profile__token" type="hidden" value="iR_ZubBD0JJrTlioAktspRZQyRKS_57AqHAr58RBx0Q" name="user_profile[_token]">
</div>

First name и last name идут с required="required" а phone почему то идет без него, из за чего так происходит? Доки читал, по проекту искал эти поля, валидаторы смотрел, ничего похожего не нашёл.
  • Вопрос задан
  • 3400 просмотров
Решения вопроса 1
pavel_salauyou
@pavel_salauyou
Symfony2 & Angular разработчик
просто в билдере укажите вручную какие поля должны быть обязательными

$builder
    ->add('phone', 'text', ['required' => true]) // и т.д.
    ->add('first_name')
    ->add('last_name')
    ->add('save', 'submit');
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
LiVsI
@LiVsI
nullable=true в Entity - значит поле не является необходимым. То есть и в форме тоже!!! Если тебе всегда требуется phone - то укажи nullable=false или не указывай вовсе.

По поводу того, что для полей First name и last name прописывается required="required" - смотри в своем проекте - на тестовом у меня не прописывается.

Если тебе нужно на уровне формы потребовать обязательное наличие значения поля - используй options: ->add('phone', 'text', array('required'=>true))
Ответ написан
@faost
По дефолту required = true, но если не указывать тип поля, значение будет определено исходя из валидации. Т. е. нужно увидеть вашу валидацию. Также вы могли переопределить шаблон форм, где собственно рисуется этот атрибут.
Ответ написан
Комментировать
Quber
@Quber
PHP Team lead
Nullable = true означает что поле может быть пустым. В билдере еще необходимо указать параметр 'required' => false чтобы валидация для поля была необязательной.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы