支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
从零学习Symfony,只要10分钟!本文将带你贯穿框架中的一些重要概念,并通过简单的小项目来解释如何快速上手。
如果你以前用过web开发框架,你对symfony的感觉会像“在家里”一样自然。如果没有,欢迎来到web开发的全新方式。
继续阅读本章之前,请确保按照安装和设置Symfony框架文中讲解的那样,同时安装好了PHP和Symfony。
框架的作用之一,是保持你的代码拥有良好的组织性;同时还能通过避免将数据库查询、html标签以及其他PHP代码整合到同一脚本环境中而令程序轻松与时俱进。为了用Symfony实现这目标,你需要学习以下几个概念。
当开发Symfony程序时,你作为开发者的责任,是写出能够迎合用户请求(比如:http://localhost:8080
)的代码,并将与请求相对应的资源显示出来。(homepage
页面)
用户请求所执行的代码,被定义于PHP类的方法之中。这些方法被称为actions,而类则称作controllers(控制器)。用户请求和代码之间的映射关系则被定义于routing(路由)配置中。浏览器显示的内容一般是通过templates(模板)来输出的。
当你浏览之前的http://localhost:8080
时,Symfony执行了在src/AppBundle/Controller/DefaultController.php
文件中定义的控制器,并渲染输出app/Resources/views/default/index.html.twig
模板。
在下面章节中你将学习Symfony控制器、路由、模板中的内部工作流的细节部分。
打开src/AppBundle/Controller/DefaultController.php
文件,你将看到以下代码(暂时先别看@Route配置,因为它将在后面被解释)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
return $this->render('default/index.html.twig');
}
} |
在Symfony程序中,控制器通常是命名中包含Controller
字样的PHP类。本例中,控制器被称作Default
,因此相应的控制器类的名字是DefaultController
。
控制器中的方法,被称为actions,它们通常关联着程序中的某个URL,而action的后缀必须是Action
。本例中,Default控制器只有一个action名为index
,其对应的方法是indexAction
。
在Actions中的代码通常很短,只有10-15行,因为他们只是调用程序的其他部分,来生成所需的信息,并且负责渲染模板,把结果显示给用户。
本例中,indexAction
是特定的留空内容,因为它并不需要调用任何其他方法,只需渲染模板并输出Homepage. 这个内容。
Symfony路由把每一个请求递交给对应的action来执行,这是通过把程序中的配置好的路由路径,来与请求中的URL进行匹配来实现的。打开src/AppBundle/Controller/DefaultController.php
文件,看一下位于indexAction
方法上面的这三行代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // src/AppBundle/Controller/DefaultController.php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
return $this->render('default/index.html.twig');
}
} |
这三行定义了路由的配置,通过@Route()
这个注释(annotation)来实现。PHP annotation是一个毋需书写代码来配置某种方法的简便方式。需要注意的是,annotation区块必须以/**
来开头,而常规php用/*
即可。
@Route()
中的第一个值定义了匹配的URL,用来触发后续操作。当你没有在URL中添加程序的域名信息时(比如http://example.com
),这些URL始终是相对的,并被称为路径(paths)。本例中,/
路径指代程序的首页。@Route()
的第二个参数(比如name=”homepage”
)是可选项,设置了该路由的名字。此处这个名字并不是必须项,但以后它会非常有用,因为在链接页面时要用到。
综合来看,当用户浏览程序的/
路径时,annotation方式的设置:@Route(“/”, name=”homepage”)
创建了一个全新的路由被命名为homepage
,当用户浏览程序的/
路径时,它令Symfony执行Defult
控制器中的index
这个action。
除了PHP annotation,路由也可以配置在YAML,XML或PHP文件中,Symfony起步的路由章节有详细解释。这种弹性架构可谓是Symfony的主力功能之一,我们的框架不强迫你使用某一特定类型的配置文件。
index
action中的唯一内容是下面的php码段:
1 | return $this->render('default/index.html.twig'); |
$this->render()
方法是个渲染模板的快捷方式。Symfony对每一个继承了Controller
基类的控制器提供了一些有用的快捷方式。
默认情况下,程序的模板都存在app/Resources/views/
目录下。因此,default/index.html.twig
模板对应的是app/Resources/views/default/index.html.twig
。打开这个文件,你会看到如下代码:
这个模板是用Twig创建的,它是一个全新模板引擎,专门为现代PHP程序而生。本入门教程的第二部分将介绍模板在Symfony中是如何工作的。
现在你对Symfony是如何工作的已经有了基本了解,观察任何一个由Symfony输出的页面底部,你会注意到有个带有Symfony标志的工具条。这是“Web Debug Toolbar”(web除错工具栏),它可是Symfony开发人员的最佳伴侣!
虽然你所看到的只是面板的冰山一角,但当你点击某个具体选项卡时,就会打开解析器,上面有非常详尽的内容,关于request请求、参数信息、安全细节以及数据库查询。
本工具提供了关于你的程序的如此之多的信息,以至你可能担心访客会看到这些敏感数据。Symfony很清楚这一点,它并不会在生产环境下(production server)把这个工具条显示给你的用户。
Symfony是如何知道你的程序是运行在本地还是远程服务器呢?请阅读execution environments(执行环境)来了解相关概念。
环境(Environment)描述的是一个配置集,用于运行你的程序。Symfony默认定义了两种环境:dev
(适合本地开发)和prod
(被优化过,适合在生产环境执行程序)。
当你访问http://localhost:8000
这个链接时,执行的就是dev
环境下的Symfony。如果要访问生产环境页面,使用http://localhost:8000/app.php
链接替代。如果你希望在任何时候都访问dev环境,可以通过http://localhost:8000/app_dev.php
这个链接来进行。
两种环境的主要区别在于,dev
优化了与开发者有关的大量信息并将它们显示出来,这意味着额外的性能损失。同时,prod
则是为了更好的性能而关闭了所有debug信息,包括除错工具栏。
还有一个区别,在于运行程序时所加载的配置文件。当你访问dev
环境时,Symfony加载的是app/config/config_dev.yml
配置文件。而如果访问prod环境,则加载的是app/config/config_prod.yml
文件。
典型情况是,两种环境共享了大量配置选项。出于这个原因,你可将常规配置放在config.yml中,并在必要的时候,为每种环境覆写特定的配置内容:
1 2 3 4 5 6 7 | # app/config/config_dev.yml
imports:
- { resource: config.yml }
web_profiler:
toolbar: true
intercept_redirects: false |
本例中,config_dev.yml
这个配置文件导入了通用的config.yml
文件中,然后它用自己的开发环境下的配置选项,覆写了所有已经存在的“除错工具条”的配置信息。
更多细节请参考Environments。
恭喜!你已经有了自己的第一段Symfony尝鲜代码。并不是很困难,对吗?还有更多的内容等待你探索,但是你应该已经看到,Symfony是如何又好又快地把开发网站变得更容易了。如果你迫不及待的想学习更多Symfony知识,研习下一章节“视图(The View)”。
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。