Symfony表单提交与handleRequest问题

jm81lzqq  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(154)

我在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
    ]);
}
brgchamk

brgchamk1#

为了找出你的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;
}

但正如评论中所说:在该字段中使用空值初始化实体,并且不允许getter返回空值,这对我来说有点奇怪,所以: ?string允许返回空值(从PHP 7.1开始)似乎是下一个最好的选择。

相关问题