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结尾;
在路由文件中控制器的命名约定如下:
- bundle名:控制器类:方法名
例如,在路由中_controller参数值为AcmeBlogBundle:Blog:show,那么它所代表的是:
Bundle名 | 控制器类 | 方法名 |
---|---|---|
AcmeBlogBundle | BlogController | showAction |
路由命名约定
路由文件位于app/config/routing.yml,如果要导入其它路由文件,该被导入路由文件的命名约定如下:
- resource: "@Bundle类名/Resources/config/routing.yml"
例如,在路由文件中resource: "@AcmeHelloBundle/Resources/config/routing.yml"语句所代表的是:导入AcmeHelloBundle中的路由文件。
模板命名约定
模板的名称约定如下:
- 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
- bundle::template:这个语法指定了一个Bundle的基本模板。以AcmeBlogBundle::layout.html.twig为例,因为中间部分 “controller”被忽略了(如Blog),模板路径位于AcmeBlogBundle中的Resources/views /layout.html.twig。
- ::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