注意:这是Symfony官方博客中的最新系列“Meet the bundle” 中的第一篇,本系列专注于挖掘社区中一些不太知名的好用bundles。


Annotations一直是开发者热衷于讨论的话题之一。一些开发者认为使用annotation是一个不好的实践,百害无一利,而另外一些却很喜欢在程序中使用,来减少“样板代码”的数量。

一般来说,Symfony对这种争论不偏不倚:你不喜欢annotation就别用。但你要是喜欢,Symfony通过SensioFrameworkExtraBundle支持并提供了几个非常有用的annotation。

本文介绍ControllerExtraBundle,它对controller提供了更多annotations,用来处理一些常见任务。其中之一是Pagination,它允许你创建和注入分页对象:

1
2
3
4
5
6
7
8
9
10
use Doctrine\ORM\Tools\Pagination\Paginator;
use Mmoreram\ControllerExtraBundle\Annotation\Paginator as CreatePaginator;
 
/**
 * @CreatePaginator(class = "AppBundle:Product")
 */
public function listAction(Paginator $paginator)
{
    // ...
}

这个annotation定义了很多配置选项:每页显示条目数、默认页数、用于结果集排序的属性、结果集的过滤条件等。

另一个有用的annotationj Form,它可以创建基于type class或type service id的Symfony表单,如下例如示:

1
2
3
4
5
6
7
8
9
10
use Mmoreram\ControllerExtraBundle\Annotation\Form as CreateForm;
use Symfony\Component\Form\Form;
 
/**
 * @CreateForm(class = "user_type", name = "user")
 */
public function registerAction(Form $user)
{
    // ...
}

这个annotation甚至能与Symfony的@ParamConverter相结合,创建一个基于前例entity的表单对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\Form\Form;
use Mmoreram\ControllerExtraBundle\Annotation\Form as CreateForm;
use AppBundle\Entity\User;
 
/**
 * @Route(path = "/user/{id}", name = "user_view")
 *
 * @ParamConverter("user", class="AppBundle:User")
 * @CreateForm(class = "user_type", entity = "user", name = "form")
 */
public function viewAction(User $user, Form $form)
{
}

参考该bunlde的文档以掌握更多annotations:@Entity@ObjectManager@Flush@JsonResponse@Log@Get@Post

关于作者

ControllerExtraBundle是由Marc Morera开发的,他是来自西班牙巴塞罗纳的Symfony老兵。除了是Symfony Barcelona小组的组长之外,他还是Elcodi的首席架构师,这是用Symfony组件开发的电商平台。

我们在寻找下一个bundle

你有任何尚未在社区叫响的Symfony有用bundle的线索吗?发送邮件至:javier.eguiluz@sensiolabs.com