创建你的第一个Symfony页面
创建一个新页面 - 无论是HTML页面还是JSON端点 - 分为两步:
- 创建一个路由: 路由(route)是一个指向你的页面URL(比如/about), 同时它映射到一个控制器.
- 创建一个控制器: 控制器(controller)是你为了构造页面而写的功能. 获取传入的request请求信息并用它创建一个Symfony Response对象, 该对象可以包含HTML内容, JSON字符串甚至是图像或PDF等二进制文件.
创建一个页面: 路由和控制器
在开始之前, 请确保你已经阅读安装和配置Symfony章节, 并可以在浏览器中访问你的Symfony应用程序.
假设你要新建一个 /lucky/number
页面, 用于生成一个随机的幸运数字并且输出它. 为此,要先创建一个控制器类和控制器方法:
<?php
// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
public function number()
{
$number = random_int(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
现在, 你需要将此控制器功能与公共URL(例如: /lucky/number)相关联, 以便在用户访问此链接时执行 number()
方法. 通过在 config/routes.yaml
文件中创建路由来定义此关联:
# config/routes.yaml
# the "app_lucky_number" route name is not important yet
app_lucky_number:
path: /lucky/number
controller: App\Controller\LuckyController::number
就这样, 如果你正在使用Symfony Web服务, 可以尝试访问下:
http://localhost:8000/lucky/number
如果你看到幸运号码被输出到浏览器, 那么恭喜! 但是在你开始玩彩票之前, 先要了解它是如何运行的. 还记得创建页面的两个步骤吗?
- 创建一个路由: 在
config/routes.yaml
文件中, 路由定义了URL到页面的映射和要调用的控制器. 在本章节中你将会了解有关路由的更多信息, 包括如何创建变量URL. - 创建一个控制器: 这是一个构建并最终返回一个Response对象的功能, 在本章节中你将会了解有关控制器的更多信息, 包括如何返回JSON响应.
要更快的创建控制器, 可以让 Symfony 来生成:
$ php bin/console make:controller
Annotation 路由
除了YAML, Symfony 允许使用annotation来定义路由. 为此, 请安装annotation包:
$ composer require annotations
你可以直接在控制器上方添加路由:
<?php
// src/Controller/LuckyController.php
// ...
+ use Symfony\Component\Routing\Annotation\Route;
class LuckyController
{
+ /**
+ * @Route("/lucky/number")
+ */
public function number()
{
// this looks exactly the same
}
}
就这样, 页面 - http://localhost/lucky/number 将像以前一样工作! Annotations 是配置路由的推荐方法.
使用 Symfony Flex 自动安装『食谱』
你可能没有注意到, 但当你运行 composer require annotations
时, 发生了两件特别的事情, 这要归功于一个名为Flex的强大的Componser插件.
首先, annotations
不是一个真正的包名: 它是Flex解析为 sensio/framework-extra-bundle
的别名.
其次, 此软件包被下载之后, Flex执行一个『食谱』, 这是一组自动指令, 告诉Symfony如何继承外部软件包. Flex『食谱』适用于许多软件包, 并且能够做很多事情, 例如增加配置文件, 创建目录, 更新.gitignore以及向.env文件添加新配置. Flex自动安装软件包, 以便于你能专注于编码.
你可以通过阅读 "Using Symfony Flex to Manage Symfony Applications"来了解有关Flex的更多信息. 但这不是必须的: 当你添加包时, Flex会在后台自动运行.
bin/console 命令
你的项目已经集成一个强大的调试工具: bin/console
命令. 尝试运行一下:
$ php bin/console
你应该可以看到一组命令列表, 可以为你提供调试信息, 帮助生成代码, 生成数据库迁移等. 当你安装更多软件包时, 你将看到更多命令.
要获取你的系统中所有路由列表, 可以使用 debug:router
命令:
php bin/console debug:router
你可以在最顶端看到你的 app_lucky_number
路由:
Name | Method | Scheme | Host | Path |
---|---|---|---|---|
app_lucky_apinumber | ANY | ANY | ANY | /lucky/number |
你还将在 app_lucky_number
之后看到调试路由 - 更多信息将在下一节中介绍.
Web调试工具栏: Debugging Dream
Web Debug Toolbar
是Symfony的杀手级工具之一: 在开发过程中大量调试信息输出在页面底部,便于调试. 安装 symfony/profiler-pack
即可开箱即用.
安装好后, 页面底部会出现一个黑色工具条. 你将了解更多有关它所包含的所有信息, 并可自由尝试: 鼠标悬停或点击工具条上不同图标即可获取有关路由, 性能, 日志记录等信息.
渲染模板
如果要从控制器返回HTML, 则可能需要渲染模板. 幸好, Symfony带有Twig: 一个简单,强大并且非常有趣的模板语言.
确保 LuckyController
继承了Symfony的基础 AbstractController 类:
// src/Controller/LuckyController.php
// ...
+ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
- class LuckyController
+ class LuckyController extends AbstractController
{
// ...
}
现在, 使用简便的 render()
函数来渲染模板. 传递一个数字变量, 以便于你可以在Twig中使用它:
// src/Controller/LuckyController.php
// ...
class LuckyController extends AbstractController
{
/**
* @Route("/lucky/number")
*/
public function number()
{
$number = random_int(0, 100);
return $this->render('lucky/number.html.twig', [
'number' => $number,
]);
}
}
模板文件存在于 templates/
目录中, 该目录是在安装Twig时自动创建的. 创建一个新目录 templates/lucky
, 在新目录中创建模板文件 number.html.twig
, 写入内容:
{# templates/lucky/number.html.twig #}
<h1>Your lucky number is {{ number }}</h1>
{{number}}
语法在Twig中用来打印变量. 刷新浏览器以获取新的幸运数字.
http://localhost:8000/lucky/number
现在你可能担心Web Debug工具去了哪里: 那是因为当前模板中没有 </body>
标签. 你可以自己添加body元素, 或者扩展 base.html.twig
, 它包含所有默认的HTML元素.
在创建和使用模板章节中, 你将了解有关Twig的所有信息: 如何渲染, 渲染其他模板以及利用其强大的布局继承系统.
查看项目结构
好消息! 你已经在项目中最重要的目录中工作:
config/
配置路由, 服务和包
src/
所有PHP代码都在此处.
templates/
所有Twig模板文件都在此处.
大多数情况下, 你将在 src/
, templates/
或 config/
中工作. 当你继续阅读时, 你将学习在每个目录中可以做些什么.
那么项目中的其他目录呢?
bin/
著名的 `bin/console` 文件存在于此 (以及其他不太重要的可执行文件).
var/
这里存储项目自动创建的文件, 如缓存文件 ( `var/cache/` ) 和 ( `var/log` ) .
vendor/
第三方 (即"vendor") 类库都在这里! 这些是通过Composer包管理器下载的.
public/
这是项目的文档根目录: 你可以在此目录放置任何可公开访问的文件.
当你安装新软件包时, 将在需要时自动创建新目录.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。