class PostForm extends AbstractController
{
use DefaultActionTrait;
use ComponentWithFormTrait;
/**
* The initial data used to create the form.
*/
#[LiveProp]
public ?Post $initialFormData = null;
protected function instantiateForm(): FormInterface
{
// we can extend AbstractController to get the normal shortcuts
return $this->createForm(PostType::class, $this->initialFormData);
}
#[LiveAction]
public function save(EntityManagerInterface $entityManager)
{
// Submit the form! If validation fails, an exception is thrown
// and the component is automatically re-rendered with the errors
$this->submitForm();
/** @var Post $post */
$post = $this->getForm()->getData();
$entityManager->persist($post);
$entityManager->flush();
$this->addFlash('success', 'Post saved!');
return $this->redirectToRoute('app_post_show', [
'id' => $post->getId(),
]);
}
}
class Post
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $title = null;
#[ORM\Column(length: 255)]
private ?string $slug = null;
#[ORM\Column(type: Types::TEXT)]
private ?string $content = null;
..........
}
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('title')
->add('slug')
->add('content')
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Post::class,
]);
}
}
class PostController extends AbstractController
{
#[Route('/post', name: 'app_post')]
public function index(): Response
{
return $this->render('post/index.html.twig', [
'controller_name' => 'PostController',
'form' => $this->createForm(PostType::class, new Post())
]);
}
#[Route('/admin/post/{id}/edit', name: 'app_post_edit')]
public function edit(Request $request, Post $post, EntityManagerInterface $entityManager): Response
{
$form = $this->createForm(PostType::class, $post);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// save, redirect, etc
}
return $this->render('post/edit.html.twig', [
'post' => $post,
'form' => $form->createView(), // use $form->createView() in Symfony <6.2
]);
}
}
{# PostForm.html.twig #}
<div {{ attributes }}>
{{ form_start(form, {
attr: {
'data-action': 'live#action:prevent',
'data-live-action-param': 'save'
}
}) }}
{{ form_row(form.title) }}
{{ form_row(form.slug) }}
{{ form_row(form.content) }}
<button>Save</button>
{{ form_end(form) }}
</div>
{# index.html.twig #}
{% extends 'base.html.twig' %}
{% block title %}Hello PostController!{% endblock %}
{% block body %}
<style>
.example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
.example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>
<div class="example-wrapper">
<h1>Hello {{ controller_name }}! ✅</h1>
This friendly message is coming from:
</div>
{{ component('PostForm', {
form: form,
}) }}
{% endblock %}
{# edit.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
<h1>Edit Post</h1>
{{ component('PostForm', {
initialFormData: post,
form: form
}) }}
{% endblock %}
当我尝试通过 ux-live-component 验证表单时,出现此错误:
模板渲染期间抛出异常(“创建组件时传递了“form”属性。未找到匹配的“form”属性或 mount() 参数,因此我们尝试将其用作 HTML 属性但是,该值不是标量(它是“Symfony\Component\Form\FormView”)。您是想将其传递给您的组件还是其名称有拼写错误?”。
在 C:\Users\Onesine\SymfonyProjects\Demo 模板中