在Symfony2中创建页面只需要两步:
1、创建路由:路由定义你页面的URI(如/about)并指定要执行的控制器(PHP函数)。当传入的请求URL匹配该路由时,Symfony2将执行指定的控制器;
2、创建控制器:控制器是一个PHP函数,它接受传入的请求并将其转换成Symfony2的Response对象。
我们喜欢这样简单的实现,因为它符合Web的工作方式。每一个Web交互都是由HTTP请求开始,应用程序的任务就是简单地解释请求并返回相应的HTTP响应。Symfony2遵循这一原则,并为你提供工具,以保证在应用程序的用户和复杂性增长时仍保持良好地组织性。
“Hello Symfony2” 页
让我们从经典的“hello,world”程序开始,当我们完成后,用户可以通过访问下列URL来得到一声问候:
其实,你可以将Symfony换成其它的名称来问候,要创建该页,我们只需简单地通过两个步骤来进行:
本教程已经假定你下载了Symfony2,并且配置好了Web服务器。上述URL假设localhost指向你新的Symfony2项目。安装详情参见安装Symfony2。
创建Bundle
在开始之前,你需要创建一个Bundle。在Symfony2中,Bundle相当于插件,你应用程序中的所有代码都需要放在Bundle中。Bundle只是一个目录(拥有PHP的名称空间),里面的内容都与某个特定功能相关(参见Bundle系统)。运行下列命令,创建AcmeStudyBundle(本章所建的游戏之作)。
php app/console Acme/StudyBundle[/]
接下来,在app/autoloader.php文件中添加了以下语句,以确保Acme名字空间被引导(参见自动加载章节):
$loader->registerNamespaces(array( 'Acme' => __DIR__.'/../src', // ... ));
最后在app/AppKernel.php文件的registerBundles()方法中初始化Bundle。
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Acme\StudyBundle\AcmeStudyBundle(), ); // ... return $bundles; }
现在你已经设置好你的Bundle,并可以在你Bundle中构建你的应用程序了。
创建路由
缺省状态下,Symfony2的路由配置文件放置在app/config/routing.yml目录中。在Symfony2中所有的配置文件也可以采用PHP或XML格式编写。
# app/config/routing.yml homepage: pattern: / defaults: { _controller: FrameworkBundle:Default:index } hello: resource: "@AcmeStudyBundle/Resources/config/routing.yml"
路由配置文件的前几行定义了用户请求”/”(首页)资源所调用的代码,更有趣的是最后一部分,它导入了位于AcmeStudyBundle中的其它路由配置文件。
# src/Acme/StudyBundle/Resources/config/routing.yml hello: pattern: /hello/{name} defaults: { _controller: AcmeStudyBundle:Hello:index }
路由由两个基本部分组成,pattern(模式)确定哪个URI匹配本路由,defaults数组指定要运行的控制器。在pattern中的占位符{name}是个通配符,它表示诸如/hello/Ryan, /hello/Fabien或其他相似的URI匹配该路由。{name}占位参数也被发送到控制器,以便我们可以使用它的值去问候用户。
路由系统在创建应用程序强大、灵活的URL结构方面有着许多令人惊叹的功能,详情请参见《Symfony2学习笔记之系统路由详解》
创建控制器
当象/hello/Ryan这样的URI被应用程序处理时,hello路由被匹配,并且AcmeStudyBundle:Hello:index控制器通过Symfony2框架被执行。创建页面过程的第二步就是创建这个控制器
实际上控制器也不过是由你创建并通过Symfony2执行的PHP函数,这个定制的应用程序代码使用请求信息去构建和准备所需资源。除了一些高级案例外,控制器最终的输出都是相同的:一个Response对象。
// src/Acme/StudyBundle/Controller/HelloController.php namespace Acme\StudyBundle\Controller; use Symfony\Component\HttpFoundation\Response; class HelloController { public function indexAction($name) { return new Response('<html><body>Hello '.$name.'!</body></html>'); } }
控制器很简单,它创建一个新的Response对象,该对象的第一个参数是它返回的响应内容(在本例中是个小小的HTML页)。
恭喜你,仅仅只是在创建了一个路由和控制器之后,你就已经得到了一个全功能页!如果你的设置没有问题的话,你的应用程序就可以跟你打招呼了:
一个可选但却被经常用到的步骤就是创建一个模板。
在创建页面时控制器是主入口和关键部分,更多信息可以在控制器章节找到。
创建模板
模板允许你把所有的展示(如HTML代码)都放到单个文件中,并且重用页面布局的不同区块。下面代码就是使用模板来替换控制器中的HTML代码。