Symfony基本面

从零学习Symfony,只要10分钟!本文将带你贯穿框架中的一些重要概念,并通过简单的小项目来解释如何快速上手。

如果你以前用过web开发框架,你对symfony的感觉会像“在家里”一样自然。如果没有,欢迎来到web开发的全新方式。

安装Symfony 

继续阅读本章之前,请确保按照安装和设置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控制器、路由、模板中的内部工作流的细节部分。

Actions and Controllers 

打开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。打开这个文件,你会看到如下代码:

1
2
3
4
5
6
7
8
{# app/Resources/views/default/index.html.twig #}
{% extends 'base.html.twig' %}
 
{% block body %}
    <h1>Welcome to Symfony</h1>
 
    {# ... #}
{% endblock %}

这个模板是用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 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)