symfony框架使用自定义类的例子

作者:袖梨 2022-06-25


之前,我们创建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里使用。

相关文章

精彩推荐