Отправка формы Symfony с выпуском handleRequest

Я испытываю странную ошибку при проверке формы в Symfony 4, Это простая контактная форма, представленная этой организацией.

class ContactRequest
{
    /** @var int */
    private $id;

    /** @var string */
    private $fullName;

     //...

    /**
     * @return string
     */
    public function getFullName() : string
    {
        return $this->fullName;
    }

В моем контроллере я обрабатываю отправку в соответствии с сайтом Symfony, но мне чего-то не хватает, потому что я получаю следующую ошибку:

Type error: Return value of App\Entity\ContactRequest::getFullName() must be of the type string, null returned

Теперь я знаю, что это значит: он ожидает, что метод вернет строку getFullName в то время как null на самом деле возвращается, но я не понимаю, почему.

Это мой контроллер

   public function contactSubmit(Request $request, ValidatorInterface $validator)
   {

        $form = $this->createForm(ContactType::class);

        $form->handleRequest($request);

        if($form->isValid()){
          //...
        }

        $errors = $validator->validate($form);

Теперь мой вопрос Не должен handleRequest способ установить значения в сущности для меня? К моему удивлению, когда я инициализировал сущность раньше, она работала хорошо, несмотря на то, что сущность уже установлена ​​в configureOptions метод в виде:

$contact = new ContactRequest;
$contact
    ->setFullName($request->request->get('contact')['fullName'])
    //...

    $form = $this->createForm(
        ContactType::class
        $contact
    );
    $form->setData($contact);

    $form->handleRequest($request);

Однако не следует ли использовать handleRequest чтобы избежать установки значений объекта вручную? Не должен handleRequest метод позаботиться об установке этих значений? Я знаю, что мог бы также проверить представленные данные по объекту (что я успешно пробовал), не используя handleRequest вообще, но это немного разозлит меня. Зачем мне устанавливать форму в таком случае?

Это моя форма (ContactType)

 //...
 public function buildForm(FormBuilderInterface $builder, array $options)
 {
        $builder
            ->add('fullName', TextType::class, [
                'required' => true,
                'empty_data' => 'a',
                'attr' => [
                    'placeholder' => 'Full Name',
                    'class' => 'form-control'
                ]
            ])
        //...
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => ContactRequest::class
    ]);
}

Пожалуйста, просветите меня:)

1 ответ

Чтобы узнать, где ваш getFullName Вызывается, вы можете (по крайней мере, в среде разработчиков) напечатать обратный след на вызове:

/**
 * @return string
 */
public function getFullName() : string
{
    if ($this->fullName === null)
    {
        echo "<pre>getFullName on uninitialized entity:\n";
        debug_print_backtrace();
        die();
    }
    return $this->fullName;
}

Но, как сказано в комментариях: инициализация сущности с нулевым значением в этом поле и не позволяющая получателю возвращать нулевое значение мне кажется странным, поэтому : ?string разрешение обнуляемых возвращаемых значений (начиная с PHP 7.1) представляется следующим лучшим вариантом.

Другие вопросы по тегам