之前,我们创建form在控制器中,很简单。但是,它使我们的控制器很难看,如果我们想把form用到别的地方,估计还要重新写代码。
由于存在这些原因,这些代码需要创建到一个自己的form表单类中。现在,创建一个新的Form目录并创建一个新文件RegisterFormType。创建类,给它一个命名空间并继承AbstractType。
1 2 3 4 5 6 7 8 |
// src/Yoda/UserBundle/Form/RegisterFormType.php namespace Yoda\UserBundle\Form; use Symfony\Component\Form\AbstractType; class RegisterFormType extends AbstractType { } |
我们需要在这个类中添加一些方法。首先,是最不重要的getName()。添加这个的目的,就是返回一个独一无二的表单字符串。他在你渲染form时使用这部分名称属性。
1 2 3 4 5 6 7 |
// src/Yoda/UserBundle/Form/RegisterFormType.php // ... public function getName() { return 'user_register'; } |
真正重要的方法是buildForm()。我使用我的IDE创建这个方法,如果你是手动创建的不要忘了声明FormBuilderInterface。
用这个buildForm方法来创建我们的form!把之前controller的form代码拷贝到这里:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// src/Yoda/UserBundle/Form/RegisterFormType.php use Symfony\Component\Form\FormBuilderInterface; // ... public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('username', 'text') ->add('email', 'email') ->add('plainPassword', 'repeated', array( 'type' => 'password' ) ); } |
完成,创建一个setDefaultOptions函数并设置data_class选项:
1 2 3 4 5 6 7 8 9 10 11 |
// src/Yoda/UserBundle/Form/RegisterFormType.php use Symfony\Component\OptionsResolver\OptionsResolverInterface; // ... public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Yoda\UserBundle\Entity\User', )); } |
使用Form类
在控制器中移除builder代码。换成CreateForm并传入RegisterFormType的实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// src/Yoda/UserBundle/Controller/RegisterController.php use Yoda\UserBundle\Form\RegisterFormType; // ... public function registerAction(Request $request) { $defaultUser = new User(); $defaultUser->setUsername('Foo'); $form = $this->createForm(new RegisterFormType(), $defaultUser); // ... } |
刷新!我们现在已经征服了form!
这些表单
快速预览。创建一个form,给它设置字段和字段类型。首先,form会返回一个关联数组,我们改变data_class配置返回一个实体对象。这些表单还可以单独在外部创建,并在controller里使用。
太好了!让我们继续。