Symfony在表单中动态添加条目会导致TypeError



在我的表单中,嵌入了一组表单。其想法是使用jQuery来添加或删除(集合中的)条目。jQuery部分运行良好。我知道我的实体也很好,因为我以前使用EasyAdminBundle来实现这个功能,这没有问题。

问题是:当我通过jQuery添加条目并提交表单时,我会收到以下错误:

Type error: Return value of AppEntityAnswer::getIsCorrect() must be of the type boolean, null returned

这是父窗体:

<?php
namespace AppFormType;
use AppEntityQuestion;
use AppFormDataTransformerTagTransformer;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeCheckboxType;
use SymfonyComponentFormExtensionCoreTypeTextareaType;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentFormExtensionCoreTypeCollectionType;
class QuestionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('answers', CollectionType::class, array(
'entry_type' => AnswerType::class,
'allow_add' => true,
'allow_delete' => true,
'delete_empty' => true,
'entry_options' => ['label' => false],
'prototype' => true,
'label' => false,
'by_reference' => false,
)
)
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
array(
'data_class' => Question::class
)
);
}
}

这是收款单:

<?php
namespace AppFormType;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeCheckboxType;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use AppEntityAnswer;
use SymfonyComponentValidatorConstraintsChoice;
class AnswerType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
'isCorrect',
CheckboxType::class,
['required' => false]
)
->add(
'text',
TextType::class,
['label' => false, 'required' => false]
);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Answer::class
));
}
}

以下是一些事实:

  • 使用Symfony 3.3
  • 实体运行良好
  • jQuery运行良好
  • 带有固定装置的表格可以很好地提交
  • 整个设置很大程度上受到本教程的启发

我读到当allow_add不为真时可能会出现问题。但这是明确设定的。删除条目效果良好。CCD_ 3也被忽略。

我的第一个想法是存在问题,因为jQuery没有正确复制表单字段,例如使用了错误的name属性。尤其是复选框有时会出现问题。但是,即使我只使用文本字段,问题仍然存在。例如:

使用Twig:生成

<input type="checkbox" id="question_answers_2_isCorrect" name="question[answers][2][isCorrect]" value="1">

jQuery的结果:

<input type="checkbox" id="question_answers_3_isCorrect" name="question[answers][3][isCorrect]" value="1">

现在,关键是:在Stack Trace中,您可以清楚地看到表单最初有数据,但它会丢失。

SymfonyComponentDebugExceptionFatalThrowableError:
Type error: Return value of AppEntityAnswer::getIsCorrect() must be of the type boolean, null returned
at src/Entity/Answer.php:82
at AppEntityAnswer->getIsCorrect()
(vendor/symfony/property-access/PropertyAccessor.php:487)
at SymfonyComponentPropertyAccessPropertyAccessor->readProperty(array(object(Answer)), 'isCorrect')
(vendor/symfony/property-access/PropertyAccessor.php:410)
at SymfonyComponentPropertyAccessPropertyAccessor->readPropertiesUntil(array(object(Answer)), object(PropertyPath), 1, true)
(vendor/symfony/property-access/PropertyAccessor.php:179)
at SymfonyComponentPropertyAccessPropertyAccessor->getValue(object(Answer), object(PropertyPath))
(vendor/symfony/form/Extension/Core/DataMapper/PropertyPathMapper.php:92)
at SymfonyComponentFormExtensionCoreDataMapperPropertyPathMapper->mapFormsToData(object(RecursiveIteratorIterator), object(Answer))
(vendor/symfony/form/Form.php:630)
// Here the data is suddenly lost
at SymfonyComponentFormForm->submit(array(), true)
(vendor/symfony/form/Form.php:574)
at SymfonyComponentFormForm->submit(array(array('text' => 'this gets lost')), true)
(vendor/symfony/form/Form.php:574)
// Here the data comes in, now see above ↑
at SymfonyComponentFormForm->submit(array('answers' => array(array('isCorrect' => '1', 'text' => 'foo'), array('text' => 'bar'), array('text' => 'baz'), array('text' => 'this gets lost'))), true)
(vendor/symfony/form/Extension/HttpFoundation/HttpFoundationRequestHandler.php:113)
at SymfonyComponentFormExtensionHttpFoundationHttpFoundationRequestHandler->handleRequest(object(Form), object(Request))
(vendor/symfony/form/Form.php:500)
at SymfonyComponentFormForm->handleRequest(object(Request))
(src/Controller/QuestionsController.php:79)

这是实体Answer:

class Answer
{
/**
* @var
* @ORMColumn(type="string")
*/
protected $text;
/**
* @var
* @ORMColumn(type="boolean")
*/
protected $isCorrect;
/**
* @var
* @ORMManyToOne(targetEntity="Question", inversedBy="answers", cascade={"persist"})
*/
protected $question;
/**
* @return mixed
*/
public function getText() : string
{
return $this->text;
}
/**
* @param mixed $text
*/
public function setText(string $text) : void
{
$this->text = $text;
}
/**
* @return mixed
*/
public function getIsCorrect() : bool
{
return $this->isCorrect;
}
/**
* @param bool $isCorrect
*/
public function setIsCorrect(bool $isCorrect) : void
{
$this->isCorrect = $isCorrect;
}
}

这是的罪魁祸首

/**
* @return mixed
*/
public function getIsCorrect() : bool
{
return $this->isCorrect;
}

将其更改为

/**
* @return mixed
*/
public function getIsCorrect() : bool
{
return boolval($this->isCorrect);
}

编辑:好的,我会尽量提供更多的信息。出现这样错误的原因是因为方法中的类型提示是错误的。例如,您的getIsCorrect方法说它返回bool,但实际上,当您的isCorrect属性未初始化时,它也返回null。就我个人而言,我建议您永远删除typehints,只保留phpdoc,但如果您真的需要它们,请尝试在实体的构造函数中初始化字段,并设置默认的db值。

相关内容

最新更新