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