在 表单入门 Part02 部分, 表单是直接在 Controller 里的. 通常这样的代码是不优雅的. 看起来也不是很专业. 我们把表单创建单独的用一个 Class
来实现. 这样会比较美观和方便维护与重用.
使用 symfony/make
包提供的辅助创建表单类指令 make:form
快速的创建一个表单类
$ bin/console make:form
The name of the form class (e.g. OrangeChefType):
> UserType
The name of Entity or fully qualified model class name that the new form will be bound to (empty for none):
> User
created: src/Form/UserType.php
Success!
Next: Add fields to your form and start using it.
把创建好的表单类: UserType 进行PHP代码完善一下. 看起来像这样:
<?php
namespace App\Form;
use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', EmailType::class, ['empty_data' => ''])
->add('passwd', PasswordType::class, ['empty_data' => ''])
->add('name', TextType::class, ['empty_data' => ''])
->add('save', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}
这样, 在 Controller 中的代码就会非常的简洁了. 修改成这样:
// ... code
public function signUp(Request $request)
{
$user = new User();
// $formBuilder = $this->createFormBuilder($user);
// $formBuilder->add('name', TextType::class, ['empty_data' => '']);
// $formBuilder->add('email', EmailType::class, ['empty_data' => '']);
// $formBuilder->add('passwd', PasswordType::class, ['empty_data' => '']);
// $formBuilder->add('save', SubmitType::class);
// $form = $formBuilder->getForm();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// ... code
Form 的创建单独转成 Class 后. 和之前的功能实现是一样的效果.
网友评论