Я только что обновился до Symfony 6.2 (точнее, 6.2.6) и теперь, не знаю почему, не могу отобразить форму. Вот что говорит отладчик:
Object of class Symfony\Component\Form\FormView could not be converted to string
В Symfony 6.2, согласно документации, должна быть возможность передавать только FormInterface в метод рендеринга в Controller. Однако в обоих случаях (то есть даже при использовании метода createView()) он не может отобразить саму форму. Есть идеи, где может быть проблема?
Метод контроллера:
#[Route(path: '/register', name: 'security-register')]
public function register(Request $request, MailUtil $util): Response
{
$form = $this->createForm(RegistrationForm::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$mail = new Mail();
$mail->setRecpient($form->get('email')->getData());
$mail->setTemplate("TestMail");
$util->sendMail($mail);
}
return $this->render("security/register.html.twig", ['form' => $form->createView()]);
}
Класс формы:
class RegistrationForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('email', EmailType::class, [
'required' => true
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'register.error.password',
'required' => true,
'first_options' => ['label' => 'Password'],
'second_options' => ['label' => 'Repeat password']
])
->add('submit', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => true,
'csrf_field_name' => '_csrf',
'csrf_token_id' => 'user_register'
]);
}
}
Ветка:
{% block container %}
<div class = "row">
<div class = "col s6 offset-s3">
<div class = "card-panel blue-grey darken-1" data-darkmode = "card-panel blue-grey darken-3">
{% if not app.user %}
<h4 class = "white-text center-align ">
Register
</h4>
{{ form_start(form) }}
{{ form.email }}
{{ form_end(form) }}
<div class = "white-text center-align">
You are logged in as {{ app.user.userIdentifier }}<br><br><a class = "waves-effect waves-light btn" href = "{{ path('app_logout') }}">Logout</a>
</div>
{% endif %}
</div>
</div>
</div>
{% endblock %}
Пытался использовать новый подход Symfony 6.2, как указано в документации: https://symfony.com/doc/current/forms.html#rendering-forms
А затем попытался использовать старый с методом createView().
Ожидаемый результат должен быть отображен в форме, однако оба метода выдают одну и ту же трассировку стека.
@Cerad Привет. Как вы можете видеть в вопросе, было это предложение: «в обоих случаях (имеется в виду даже использование createView())», означающее, что до того, как этот вопрос был задан, я пытался передать FormInterface без метода createView().
В веточке {{ form.email }}
неправильно. Вероятно, поэтому возникает ошибка.
Переключиться на {{ form_row(form.email) }}
, например
Спасибо за подсказку. Совершенно пропустил, что это было там. Спасибо :)
Добро пожаловать, часто самое очевидное, что мы все скучаем, ха-ха
Или вы можете использовать виджет и ярлык отдельно.
{{ form_label(form.email) }}
{{ form_widget(form.email) }}
Посмотрите внимательно на пример в документации. Относительно новый метод AbstractController::render принимает исходную форму $form в качестве входных данных и вызывает для нее вызов createView. Также полезно взглянуть на исходный код AbstractController, чтобы точно увидеть, что происходит и чем он отличается от предыдущей версии Symfony.