Fork me on GitHub

Symfony上手指南

Symfony是什么?

1. Symfony 是一套组件库

你的第一直觉可能觉得 Symfony 是一个 web 框架,但是从更底层的角度来说,Symfony 首先它是一套组件库,Symfony 组件库包含了高达30多个组件,这些组件不仅 Symfony 自己在用,很多 web 框架比如 Laravel 也在用。

2. Symfony 是一个 web 框架

在众多组件的基础之上,Symfony 构建一个用于 web 开发的框架,框架名字依然是 Symfony。当前最新版本是4.1.0

3. Symfony 是一套设计哲学

Symfony 致力于最大程度的给 web 开发带来便利,不提倡重复造轮子,拥抱和促进职业化、最佳实践、标准化以及可互用的现代PHP程序开发。

综上所述:Symfony是一个框架,是一组工具,是一整套开发方法。除此之外,Symfony还有自己的哲学体系和社区。

上手 Symfony 框架

安装

Symfony 官方提供了两种安装方式,1是使用 Symfony installer,2是使用 Composer。这里推荐使用 Composer 进行安装。

安装最新版本:

1
composer create-project symfony/framework-standard-edition my_project_name

目录结构说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
blog/
├─ app/
│ ├─ config/
│ └─ Resources/
├─ bin
│ └─ console
├─ src/
│ └─ AppBundle/
├─ var/
│ ├─ cache/
│ ├─ logs/
│ └─ sessions/
├─ tests/
│ └─ AppBundle/
├─ vendor/
└─ web/

app/config/,存放用来定义各种环境的配置文件;
app/Resources/,存放程序级别的全部模板和翻译文件。
var/cache/,存放程序生成的缓存;
var/logs/,存放程序生成的日志;
var/sessions/,存放程序生成的session
tests/AppBundle/,存放程序的自动测试(如单元测试);
vendor/,这个文件夹是Composer安装的程序依赖的位置;
web/,存放前端控制器和所有的web assets资源,例如css、js和图片。

运行 Symfony

Symfony利用了PHP内置的web服务器,使用命令来启动服务器。

1
php bin/console server:run

然后,打开浏览器访问http://localhost:8000/链接,即可看到Symfony欢迎页.

配置 Symfony

支持多种配置文件

目录app/configSymfony 的配置中心。配置文件格式支持yml,xml,.php格式,推荐使用 yml 格式。简单,可读性强。

支持多环境多配置文件

Symfony 支持在不同的环境下加载不同的配置文件,用于区分开发,测试,生产环境。

配置文件命名约定
加载配置文件时遵循config_xxxenv格式进行查找。比如开发环境配置文件为config_dev.yml,路由文件也是如此,routing_dev.yml为开发环境的路由配置文件。

每个环境对应一个前端控制器,比如开发环境的入口文件为app_dev.php.

抽取相同配置

开发,测试环境总有些配置是相同的,因此可以放在同一份配置文件中。把这部分公共配置抽取出来。在配置文件中,可使用imports关键字导入主配置。

模版语言

每个 web 框架都会有自己的模版引擎,用户在 html 文件中渲染数据。Symfony 使用Twig来作为自己的模版语言。

twig具体使用方法可参考官网文档,这里不再详细讨论。

路由

Symfony 支持多达四种方式的路由书写格式,分别是注解方式,yml 格式,xml 格式,php 格式。推荐使用注解方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// src/AppBundle/Controller/BlogController.php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class BlogController extends Controller
{
/**
* Matches /blog exactly / 精确匹配了/blog
*
* @Route("/blog", name="blog_list")
*/
public function listAction()
{
// ...
}

/**
* Matches /blog/* / 匹配的是/blog/*
*
* @Route("/blog/{slug}", name="blog_show")
*/
public function showAction($slug)
{
// $slug will equal the dynamic part of the URL
// e.g. at /blog/yay-routing, then $slug='yay-routing'
// $slug 必须等同于URL中的动态部分
// 即,在 /blog/yay-routing 中 $slug='yay-routing'

// ...
}
}

数据库

Symfony 使用Doctrine ORM来连接数据库,但是二者完全解耦,你完全可以不使用 Doctrine

数据库配置

数据库连接信息配置在app/config/parameters.yml

1
2
3
4
5
6
7
8
# app/config/parameters.yml
parameters:
database_host: localhost
database_name: test_project
database_user: root
database_password: password

# ...

使用 Doctrine ORM 要注意一点的是,Doctrine数据库连接使用的Data mapping格式,和Laravel Eloquent不同,前者多个数据表映射文件。

Bundle系统

什么是 Bundle?

BundleSymfony体系中的一等公民。表示一个独立的功能模块,比如博客模块,论坛模块,在 Symfony 可表示为:BlogBundle,一个ForumBundle,每个Bundle都包含着关乎那个功能的所有东西,包括php文件,模板,cssjs文件,tests,以及其他。每一个功能的子项都存在于bundle中,每一个功能都存在于bundle中。

如何创建 Bundle?

Symfony标准版内置了超好用的命令,用来帮你创建全功能bundle。比如创建一个 TestBundle

1
php bin/console generate:bundle --namespace=Acme/TestBundle

该命令会生成一个 Bundle 的骨架,包含控制器,模版,路由资源。

注册 Bundle

Bundle 需要注册才能加载使用,在app/AppKernel.php文件中注册自定义 Bundle

// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
        new Symfony\Bundle\AsseticBundle\AsseticBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new AppBundle\AppBundle(),
    );

    if (in_array($this->getEnvironment(), array('dev', 'test'))) {
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    }

    return $bundles;

更多 Bundle 操作参考官方文档

总结

以上是 Symfony 的简单使用,可以看出Symfony 是一个可高度定制化的框架,具有很高的扩展性,而且非常易于使用,enjoy it:)