我在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
]);
}
请赐教:)
答案 0 :(得分:0)
为了找出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)似乎是下一个最佳选择。