Best Practice

Best Practice

把表单定义在PHP类中。

表单组件允许你在控制器中快速构建表单。当你不需要在别处复用表单时这是很好用的。但是为了组织代码和可复用,我们推荐你把每一个表单定义在它们自己的PHP类中:

Best Practice

Best Practice

要使用这个类,使用createForm()即可,然后把FQCN完整类名传入:

  1. // ...
  2. use AppBundle\Form\PostType;
  3.  
  4. // ...
  5. public function newAction(Request $request)
  6. {
  7. $post = new Post();
  8. $form = $this->createForm(PostType::class, $post);
  9.  
  10. }

你也可以将表单注册为服务。这仅在你的表单类型需要利用容器将一些依赖注入进来时才有意义,否则,这会造成不必要的过载,因此,对于所有form type类,皆不推荐这样做(即将form type注册为服务)。

表单类应该不被知悉“要被用在哪里”。这样它们才能在未来更容易被复用。

Best Practice

Best Practice

在模板中去添加表单按钮,而不是在form type类或控制器中。

这个表单也许 被设计为创建贴子用,但如果你希望复用它来编辑贴子,则按钮的标签就是错的。取而代之,一些开发者在控制器中配置按钮:

  1. namespace AppBundle\Controller\Admin;
  2.  
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  5. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  6. use AppBundle\Entity\Post;
  7. use AppBundle\Form\PostType;
  8.  
  9. class PostController extends Controller
  10. {
  11. // ...
  12.  
  13. {
  14. $post = new Post();
  15. $form = $this->createForm(PostType::class, $post);
  16. $form->add('submit', SubmitType::class, (
  17. 'label' => 'Create',
  18. 'attr' => array('class' => 'btn btn-default pull-right')
  19. ));
  20.  
  21. // ...
  22. }
  23. }

这同样犯了重大错误,因为你在纯PHP代码中混合了表现层的标记(labels、css classes,等等)。关联分离(seperation of concern)永远是值得遵循的最佳实践,所以应该把这些与视图相关的东西,移动到view层:

有很多方式可以渲染你的表单,比如用一行代码渲出整个表单,或是独立渲染每一个表单字段。哪种更合适取决于你所需要的表单自定义程度。

一个最简单的方式——在开发阶段格外有用——就是通过form标签和form_widget()模板函数来渲染出所有字段:

  1. {{ form_start(form, {'attr': {'class': 'my-form-class'} }) }}
  2. {{ form_widget(form) }}

如果你需要精细控制字段渲染,那么你应去除函数并手动逐个渲染字段。参考来了解具体办法,以及如何能够使用全局主题来控制表单渲染。

在处理表单的提交时,通常遵循着相似的模式:

再来,我们推荐在if声明中使用$form->Submitted()以利明晰。这并非技术上的要求,因为最先调用的就是isSubmitted()。但是如果不这样写,程序读起来就不太好,因为看上去表单似乎总是 被执行(甚至在GET请求时)。