这一章将介绍如何创建一个简单的页面。首先介绍几点内容。
BloggerBlogBundle
的路由配置位于src/Blogger/BlogBundle/Resources/config/routing.yml
文件中。它在创建时默认添加了一条记录:
blogger_blog_homepage:
path: /hello/{name}
defaults: { _controller: BloggerBlogBundle:Default:index }
其中blogger_blog_homepage
为该条路由的名称;
path
为该条路由的url匹配规则,它可以是一个正则式;defaults
为该路由指明了对应的控制器。
这里我们的路由是使用yml文件配置的,这个在创建Bundle时可以选择。可选的配置文件格式有:php, xml, yml 和 annotation。为了简便我们约定如下:
Bundle在创建时默认创建了一个DefaultController
,对应的文件为src/Blogger/BlogBundle/Controller/DefaultController.php
。
路由配置中控制器的设置格式为:bundle:controller:template
。例如上面的例子中设置为:BloggerBlogBundle:Default:index
,即表示对应的控制器处理方法为src/Blogger/BlogBundle/Controller/DefaultController.php
中的indexAction
,使用的模板为src/Blogger/BlogBundle/Resources/views/Default/index.html.twig
。
这个算是Symfony框架中的约定。在Symfony框架中有存在一些约定,如:
<name>Controller.php
,模板文件的命名为:<name>.html.twig
,测试用命文件命名以Test.php
结尾,等等;<name>Action
,对应的模板文件为:<name>.html.twig
。对于这些约定如果之前接触过Rails的话应该不难理解。
在Symfony2中提供了 Twig 与 PHP 两种格式的模板,这里我们选用 Twig。
模板文件根据不同控制器存放在Resources/views/<Controller>
目录中。上面也说过了文件的命名格式为<name>.html.twig
,如果模板是json内容也可以为<name>.json.twig
。
Twig模板引擎的语法与Django的模板引擎和Jinja模板引擎非常相似。以下是index.html.twig
的内容:
Hello {{ name }}!
基本内容已介绍完毕,接下来就创建一个新的页面。由于我们不需要生成器生成的一些文件,可以将其删掉。
删掉DefaultController
:删除src/Blogger/BlogBundle/Controller/DefaultController.php
文件和src/Blogger/BlogBundle/Resources/views/Default
目录,最后移除src/Blogger/BlogBundle/Resources/config/routing.yml
中的路由配置。
现在我们创建一个PageController
,执行命令:
$ php app/console generate:controller --controller=BloggerBlogBundle:Page --route-format=yml
然后会生成文件:src/Blogger/BlogBundle/Controller/PageController.php
。
由于 Twig 支持模板继承,我们接着使用“三层继承”方法( http://symfony.com/doc/2.5/book/templating.html#three-level-inheritance ),这个方法让我们可以在应用程序中通过三个独立的层次调整页面。
1.主模板(第1层)
首先创建主模板app/Resources/views/base.html.twig
,在模板继承中它的名字为:::base.html.twig
。
2.应用程序模板(第2层)
然后在Bundle中创建应用程序自己的模板src/Blogger/BlogBundle/Resources/views/layout.html.twig
,在模板继承中它的名字为:BloggerBlogBundle::layout.html.twig
。
3.页面模板(第3层)
最后根据Controller中的action方法创建页面的模板src/Blogger/BlogBundle/Resources/views/Page/index.html.twig
,它的名字为:BloggerBlogBundle:Page:index.html.twig
编辑src/Blogger/BlogBundle/Resources/config/routing.yml
文件,添加路由:
blogger_blogBundle_homepage:
pattern: /
defaults: { _controller: BloggerBlogBundle:Page:index }
requirements:
_method: GET
然后在PageController
中新建一个indexAction
方法。
class PageController extends Controller
{
public function indexAction()
{
return $this->render('BloggerBlogBundle:Page:index.html.twig');
}
}
现在浏览器打开页面 http://127.0.0.1:8000/ 看看效果。