Symfony2有着很多的命名约定,这一点大家可能在阅读Symfony2Book中已经看到了。那么Symfony2到底有多少命名约定呢,它们的命名约定分别是什么呢?由于Symfony2中不同组件的命名约定各不相同,所以很有必要将各种不同的命名约定都做一个梳理。下面是本人梳理出来的命名约定,如果在以后碰到这里没有的会再继续完善,也欢迎各位兄弟指出丢失的命名约定。

Bundle命名约定

Bundle还是一个PHP名称空间。该名称空间必须遵循PHP5.3名称空间和类名的技术互操作性标准:它由供应商段开始,后面接着0或更多的类别段,结束是名称空间的简称,必须以Bundle后缀结束。Bundle的类名必须遵循以下几个简单的规则:

  • 只能用字母数字和下划线;
  • 使用驼峰命名法;
  • 使用描述性的缩写名(不多于2个单词);
  • 名称的前缀为供应商(或可选的类别名称空间);
  • 名称必须以Bundle结尾。

如:

名称空间 Bundle类名
Acme\Bundle\BlogBundle AcmeBlogBundle
Acme\Bundle\Social\BlogBundle AcmeSocialBlogBundle
Acme\BlogBundle AcmeBlogBundle

控制器命名约定

控制器类名必须遵循以下几个简单的规则:

  • 使用驼峰命名法;
  • 名称必须以Controller结尾;
  • 其方法必须以Action结尾;

在路由文件中控制器的命名约定如下:

  1. bundle名:控制器类:方法名

例如,在路由中_controller参数值为AcmeBlogBundle:Blog:show,那么它所代表的是:

 

Bundle名 控制器类 方法名
AcmeBlogBundle BlogController showAction

路由命名约定

路由文件位于app/config/routing.yml,如果要导入其它路由文件,该被导入路由文件的命名约定如下:

  1. resource: "@Bundle类名/Resources/config/routing.yml" 

例如,在路由文件中resource: "@AcmeHelloBundle/Resources/config/routing.yml"语句所代表的是:导入AcmeHelloBundle中的路由文件。

模板命名约定

模板的名称约定如下:

  1. bundle:controller:template:这个语法用于特定页面的特定模板。该字符串被冒号(:)分隔成三个部分,以AcmeBlogBundle:Blog:index.html.twig为例,其含义如下:
    • AcmeBlogBundle(bundle):模板位于AcmeBlogBundle目录之中(如src/Acme/BlogBundle)
    • Blog(controller):指定模板位于Resources/views目录中的Blog子目录下
    • index.html.twig(template):文件名叫index.html.twig
  2. 假定AcmeBlogBundle位于src/Acme/BlogBundle目录,那么布局的最终路径应该是src/Acme/BlogBundle/Resources/views/Blog/index.html.twig
  3. bundle::template:这个语法指定了一个Bundle的基本模板。以AcmeBlogBundle::layout.html.twig为例,因为中间部分 “controller”被忽略了(如Blog),模板路径位于AcmeBlogBundle中的Resources/views /layout.html.twig。
  4. ::template:这个语法指定了一个应用程序范围的模板或布局。注意该字符串由两个冒号(::)开始,意思是bundle和 controller部分被忽略。这意味着该模板没有位于任何Bundle之中,因此它应该位于app/Resources/views/目录中。

翻译命名约定

Symfony2可以根据翻译文件的命名约定来确定翻译的细节。每个消息文件必须按照domain.locale.loader这种模式命名:

  • domain: 可选,用来按组来组织消息(如admin、navigation或缺省消息),参见使用消息域;
  • locale: 翻译的语言环境(如:en_GB、en等)。所谓语言环境基本上是指用户语言和国家。它可以是字符串,然后你的应用程序可以用它来管理翻译和其它不同的格式(如货币格式)。我们建议使用ISO639-1语言代码,加上一个下划线(_),然后再加上ISO3166国家代码(如:fr_FR对应法语/法国);
  • loader: Symfony2如何引导和分析文件(如:xliff、php或yml)。

事件命名约定

唯一的事件名可以是任意字符串,但最好能够遵循一些简单的命名约定:

  • 只使用小写字母、数字、点号(.)和下划线(_);
  • 名称空间的前缀后跟点号(如:core.);
  • 名字后面跟动词,表明采取什么动作(如:request)。

这里有一些推荐的事件名示例:

  • core.response
  • form.pre_set_data