Отправка формы 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) представляется следующим лучшим вариантом.