爱自由 2019-06-29
创建一个新页面 - 无论是HTML页面还是JSON端点 - 分为两步:
假设你要新建一个 /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.要更快的创建控制器, 可以让 Symfony 来生成:
$ php bin/console make:controller除了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 是配置路由的推荐方法.
你可能没有注意到, 但当你运行 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
命令. 尝试运行一下:
$ 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 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中用来打印变量. 刷新浏览器以获取新的幸运数字.
现在你可能担心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/
这是项目的文档根目录: 你可以在此目录放置任何可公开访问的文件.
当你安装新软件包时, 将在需要时自动创建新目录.