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 AppEntityContactRequest::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
    ]);
}

,以找出您可以(在开发环境中至少(打电话给您的 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(似乎是下一个最佳选择。

最新更新