# 在Symfony中创建第一个页面
创建页面,无论是HTML还是JSON,都仅仅只有两步:
创建路由:路由就是指向控制器和页面的URL(比如,`/about`)
创建一个控制器:控制器就是您创建页面的PHP函数。您搜集请求信息,并产生Symfony `Response`对象,它可以处理HTML内容,JSON字符串,甚至是二进制文件,譬如一个图片文件或者PDF文件。
# 创建页面:路由和控制器
在继续之前,请确保您已经阅读了[安装](243916)章节,并且可以在浏览器中访问您的Symfony项目。
假设您想创建一个页面,`/lucky/number`,它将会生成一个幸运数字(当然是随机的),并且打印它。那么,创建一个“控制器类”和一个“控制器”方法用来当有人访问`/lucky/number`时执行您的业务需求。
~~~
// 编辑的文件是:src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
/**
* @Route("/lucky/number")
*/
public function numberAction()
{
$number = mt_rand(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
~~~
在解释代码之前,请测试它。如果您使用PHP内置Web服务器,请访问以下URL:
http://localhost:8000/app_dev.php/lucky/number
如果您使用的是内置的PHP Web服务器,那么URL中的app_dev.php可以省略。
如果您在浏览器中看到一个幸运数字,恭喜您。但高兴之余,请想想它是如何运行的?还记得创建页面的两个步骤吗?
1. 创建路由:`numberAction`方法上的`@Route`就是路由,它定义了这个页面的URL模式。您将在[路由](244172)了解到更多关于路由的知识,包括如何创建可变URL。
2. 创建控制器:路由下边的方法-`numberAction()`就是控制器。它是您创建页面,最终返回一个`Response`对象的地方。您将在[控制器](244173)章节中学到更多关于控制器的细节,包括如何返回JSON数据。
# Web Debug工具
如果您的页面工作良好,那么您会在浏览器底部看到一个工具条。他被称为Web Debug工具条:您的调试好帮手。您将会学到更多有关它的知识,但现在请移动鼠标,点击不同图标来获取关于路由、性能、日志等等调试信息。
# 渲染模板(使用服务容器)
如果控制器返回的是HTML,那您可能像渲染一个模板。幸运的是Symfony整合了`Twig`,一个易学、强大的,事实上相当有趣的一个模板语言。
首先,请确保`LuckyController`继承自Symfony的基类`Controller`
~~~
// 编辑的文件是 src/AppBundle/Controller/LuckyController.php
// ...
// --> add this new use statement
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class LuckyController extends Controller
{
// ...
}
~~~
现在就可以使用render()方法来渲染一个模板,给它我们生成的幸运数字变量,这样我们就可以渲染页面了。
~~~
// 编辑的文件是 src/AppBundle/Controller/LuckyController.php
// ...
class LuckyController extends Controller
{
/**
* @Route("/lucky/number")
*/
public function numberAction()
{
$number = mt_rand(0, 100);
return $this->render('lucky/number.html.twig', array(
'number' => $number,
));
}
}
~~~
最后,模板文件应该放在`app/Resources/views`目录中。在`app/Resources/views/lucky`目录下创建一个名为`number.html.twig`的新文件。
~~~
{# app/Resources/views/lucky/number.html.twig #}
<h1>Your lucky number is {{ number }}</h1>
~~~
在`Twig`中,`{{ number }}` 语法是用来输出变量的。刷新浏览器来获取您新的幸运数字。
http://localhost:8000/lucky/number
在[创建和使用模板](244174)章节中,您将学到关于Twig的一切:如何循环,渲染其他模板,掌握它强大的布局集成系统。
# 项目结构一览
重大新闻!您已经在项目两个最重要的目录下工作了:
`app/`
包含了譬如配置和模板这类东西。基本上凡是不是PHP代码的东西都在这儿。
`src/`
您PHP代码所在地。
99%的时间里,您将会工作在`src/`(PHP文件)或者是`app/`(其他文件)。随着阅读的深入,您将学到它们都能做什么。
那么,项目其他目录是做什么?
`bin/`
著名的bin/console文件就在这里(其他相对不太重要的执行文件)。
`tests/`
应用自动测试目录(比如单元测试)。
`var/`
用来存储自动创建的文件。比如缓存文件(`/var/cache/`),日志文件(`var/logs/`)和session文件(`/var/sessions/`)。
`vendor/`
第三方类库放在这里!他们是通过Composer包管理器下载到这里的。
`web/`
这是项目的文档根目录:请将公众文件放在这里(比如:CSS,JS和图片)
# Bundles和配置
您的Symfony应用包含了一组预安装的Bundles,像`FrameworkBundle`和`TwigBundle`。Bundles和插件的理念很类似,但有个很重要的不同:所有Symfony应用的功能都来自Bundles。
Bundles是通过app/AppKernel.php(app/目录下少有的PHP文件)注册的。每个Bundles都为您提供了大量的*工具*,有时被称为*服务*。
~~~
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
// ...
);
// ...
return $bundles;
}
// ...
}
~~~
例如,`TwigBundle`就是负责为您的应用添加Twig工具的。
事实上,您可以下载和添加更多第三方Bundles到您的应用来获取更多的工具。假设您需要分页列表功能,Symfony中有很多这样的三方Bundles。
您可以通过`app/config/config.yml`文件来控制自己的Bundles行为。其他的细节,比如环境和参数将会在[配置](244175)章节中讨论。