创建一个新页面, 不管是html页面还是json数据 - 都需要做这简单的两步:
- 创建一个路由: 一个路由就是一个指向你的页面和你的控制器的URL (比如. /about) .
- 创建一个控制器: 一个控制器就是个你写的创建页面的PHP函数. 你接收来自客户端的请求信息, 然后根据请求来创建一个Symfony的response对象, 这个对象可以用来容纳html内容, 一个json字符, 甚至可以是一个二进制文件, 比如说一张图片或一个pdf文件.
创建页面: 路由和控制器
在我们继续之前, 先确保你已经安装了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>'
);
}
}
测试一下, 访问:
如果在页面中显示了一个随机数字, 恭喜你! 让我们来回顾一下, 我们是通过哪两步来新建一个页面的?
创建一个路由:
numberAction()
方法上的@Route
就是我们创建的路由: 它定义了这个页面的url部分.创建一个控制器: 路由下面的方法
numberAction()
, 我们叫它控制器. 它是一个你创建页面和返回response对象的地方.
Web调试工具
就算你的页面工作正常, 你也应该看看你的页面最下面的导航条. 我们叫它Web调试工具: 它是你调试的蜜友. 随着时间的推移, 你会越来越了解它. 现在你可以随便点点, 把鼠标放到上面点击不同的图标获取一些关于路由, 性能, 日志信息.
渲染模板 (通过服务容器)
如果你在控制器中返回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()
函数来渲染模板. 把 number
变量注入到模板当中:
// 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
目录中. 创建一个新的文件夹 lucky
, 并在这个文件夹中新建一个文件 number.html.twig
, 内容为:
{# app/Resources/views/lucky/number.html.twig #}
<h1>Your lucky number is {{ number }}</h1>
{{number}}
语法是用来在twig中输入变量的. 刷新你的浏览器, 工作正常.
查看你的项目结构
也许你并不知道, 你已经在两个非常重要的目录下工作过了.
app/
包括了一些配置文件和模板文件. 一般来说, 这里放一些不是php代码的东西.
src/
你的php代码放在这儿.
99%的时候, 你都会在 src/
和 app/
工作.
bin/
bin/console
文件就放在这儿. 还有一些次要的可执行文件.
tests/
放一些应用的测试文件, 比如说单元测试.
var/
这个文件夹主要放一些自动生成的文件, 比如说缓存文件和日志文件.
vendor/
第三方的库全在这儿了! 通过composer包管理器下载的包都在这儿
web/
这是你的项目的根目录, 放一些公共访问的文件
包和配置
你的Symfony应用已经预安装了一些包的集合, 例如 FrameworkBundle
和 TwigBundle
. 包和插件的概念有点像, 但有一点非常重要的区别: Symfony应用所有的功能都是来源于包.
在app/AppKernel.php
中注册包, 每个包都提供很多工具, 有时候我们叫它服务.
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
// ...
);
// ...
return $bundles;
}
// ...
}
例如, TwigBundle
是负责添加Twig工具到你的应用中.
最后, 你将来可能会下载和安装更多的第三方包到你的应用中, 以此来获取更多的工具. 想象一下, 有一个帮你分页的包, 而它是已经存在的,开箱即用.
你可以通过ap/config/config.yml
文件来控制你的包的行为. 我们会在另外一个章节中探讨更多的细节.