87.md 7.2 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# Symfony 简介

> 原文: [http://zetcode.com/symfony/intro/](http://zetcode.com/symfony/intro/)

这是 Symfony 的入门教程。 它展示了 Symfony PHP 框架,并展示了如何创建简单的示例。 本教程介绍了 Symfony 版本 4。

## Symfony

Symfony 是一组可重用的 PHP 组件和一个用于 Web 项目的 PHP 框架。 Symfony 于 2005 年发布为免费软件。Symfony 的原始作者是 Fabien Potencier。 Symfony 受到 Spring 框架的极大启发。

Symfony 使用了几个 PHP 开源项目,例如 Doctrine 对象关系映射库,PDO 数据库抽象层,PHPUnit 测试框架,Twig 模板引擎和 Swift Mailer 电子邮件库。

Symfony 创建了自己的组件,包括 Symfony 依赖注入器和 Symfony YAML 解析器。

## 设置 Symfony 项目

W
wizardforcel 已提交
17
为了创建一个 Symfony 4 项目,我们需要 PHP 7(以及相关的库,例如 php-xml 或 php-mcrypt)和`composer`。 项目相关性将写入`composer.json`文件。
W
wizardforcel 已提交
18

W
wizardforcel 已提交
19
```php
W
wizardforcel 已提交
20 21 22 23
$ composer create-project symfony/skeleton symfirst

```

W
wizardforcel 已提交
24
使用`composer`,我们创建了一个名为`first`的新 Symfony 骨架项目。 Symfony 框架等效于微型框架,在微型框架中,我们需要自己安装所有模块。 我们决定要安装什么模块。 这对学习有好处。
W
wizardforcel 已提交
25

W
wizardforcel 已提交
26
```php
W
wizardforcel 已提交
27 28 29 30 31 32 33 34
$ cd symfirst

```

不要忘记去项目目录。

## Symfony 项目结构

W
wizardforcel 已提交
35
作曲家创建了一个 Symfony 应用结构。
W
wizardforcel 已提交
36

W
wizardforcel 已提交
37
```php
W
wizardforcel 已提交
38 39 40 41 42 43
$ ls -p
bin/           composer.lock  public/  symfony.lock  vendor/
composer.json  config/        src/     var/

```

W
wizardforcel 已提交
44
`bin`目录包含`console`工具,该工具是用于执行各种类型命令的命令行工具。 `public`目录包含 Web 文件。 在 Symfony 骨架应用中,它包含一个文件:`index.php`,它是一个 Symfony 前端控制器。
W
wizardforcel 已提交
45 46 47 48 49 50 51 52 53 54 55

第三方依存关系存储在`vendor`目录中。 `config`目录包含配置文件。 源代码写在`src`目录中。 `var`目录包含临时文件,例如缓存数据。

`composer.json`中定义了 Composer 依赖项。 `composer.lock`记录已安装的确切版本,以便以后可以重新安装。 它可以确保每个在项目上工作的人都具有相同的确切版本的库。 `symfony.lock`文件是 Symfony 配方的正确锁定文件。

还有两个特定的隐藏文件:`.env``.env.dist``.env`的内容成为环境变量。 环境变量由各种工具(例如 ORM 库)使用。 `.env`可能包含敏感或计算机特定的数据; 因此,不应将其提交到存储库。 相反,`.env.dist`带有一些伪值。

## 安装 Symfony 项目依赖项

接下来,我们将安装一些项目依赖项。

W
wizardforcel 已提交
56
```php
W
wizardforcel 已提交
57 58 59 60 61 62
$ composer require server maker --dev

```

我们安装了开发服务器和 maker 组件,该组件用于生成命令,控制器,表单类或事件订阅者。

W
wizardforcel 已提交
63
```php
W
wizardforcel 已提交
64 65 66 67
$ composer require annotations twig

```

W
wizardforcel 已提交
68
我们将安装两个附加的 Symfony 模块。 `annotations`提供了一种使用注释配置控制器的方法。 `twig`允许在 Symfony 应用中使用 Twig 模板引擎。
W
wizardforcel 已提交
69 70 71 72 73

## Symfony 创建控制器

Symfony 控制器是一个 PHP 函数,它从`Request`对象读取信息,并创建并返回`Response`对象。 响应可能是 HTML 页面,JSON,XML,文件下载,重定向,404 错误等等。

W
wizardforcel 已提交
74
```php
W
wizardforcel 已提交
75 76 77 78 79 80 81 82
$ php bin/console make:controller HelloController

```

使用`console`工具,创建`HelloController`。 在`src/Controller/`目录中创建控制器。

`src/Controller/HelloController.php`

W
wizardforcel 已提交
83
```php
W
wizardforcel 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    /**
     * @Route("/plain", name="plain")
     */
    public function helloPlain(): Response
    {
        return new Response("Hello there", Response::HTTP_OK,
            ['content-type' => 'text/plain']);
    }
}

```

这是`HelloController`。 它位于`src/Controller/HelloController.php`文件中。

W
wizardforcel 已提交
108
```php
W
wizardforcel 已提交
109 110 111 112 113 114 115 116
/**
 * @Route("/plain", name="plain")
 */
public function helloPlain()
{

```

W
wizardforcel 已提交
117
路由是从 URL 路径到控制器方法的映射。 `@Route`注解将`/plain` URL 路径映射到`helloPlain()`函数。
W
wizardforcel 已提交
118

W
wizardforcel 已提交
119
```php
W
wizardforcel 已提交
120 121 122 123 124 125 126
return new Response("Hello there",  Response::HTTP_OK,
  ['content-type' => 'text/plain']);

```

该函数返回一个`Response`对象。 `Response`对象保存需要从给定请求发送回客户端的所有信息。 构造函数最多包含三个参数:响应内容,状态代码和 HTTP 标头数组。 默认状态码为`Response::HTTP_OK`,内容类型为`text/html`

W
wizardforcel 已提交
127
```php
W
wizardforcel 已提交
128 129 130 131 132 133
$ php bin/console server:run

```

使用`bin/console server:run`命令启动 Web 服务器。 要停止服务器,我们使用`bin/console server:stop`命令。

W
wizardforcel 已提交
134
```php
W
wizardforcel 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147
$ curl localhost:8000/plain
Hello there

```

我们向普通路由发出 GET 请求,并查看文本响应。

## Symfony 与 Twig 模板

当我们使用`composer require twig`命令时,将 Twig 模板引擎安装到项目目录中。 还创建了一个`templates`目录。 在该目录中,我们放置模板文件。 模板文件具有`html.twig`扩展名。

`src/Controller/HelloController.php`

W
wizardforcel 已提交
148
```php
W
wizardforcel 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    /**
     * @Route("/plain", name="plain")
     */
    public function helloPlain(): Response
    {
        return new Response("Hello there", Response::HTTP_OK,
            ['content-type' => 'text/plain']);
    }

    /**
     * @Route("/twig", name="twig")
     */
    public function helloTwig(): Response
    {
        $message = "Hello from Twig";
        return $this->render('hello/index.html.twig', ["message" => $message]);
    }
}

```

W
wizardforcel 已提交
180
我们已经更新了`HelloController.php`文件; 我们添加了一条新路由。 这次,该函数呈现了一个 Twig 模板。
W
wizardforcel 已提交
181

W
wizardforcel 已提交
182
```php
W
wizardforcel 已提交
183 184 185 186 187 188 189 190
/**
 * @Route("/twig", name="twig")
 */
public function helloTwig(): Response
{

```

W
wizardforcel 已提交
191
`helloTwig()`函数映射到`twig`路径。
W
wizardforcel 已提交
192

W
wizardforcel 已提交
193
```php
W
wizardforcel 已提交
194 195 196 197 198 199 200 201 202
$message = "Hello from Twig";
return $this->render('hello/index.html.twig', ["message" => $message]);

```

Twig 渲染位于`templates`目录中的`'hello/index.html.twig`文件。 `render()`方法也接受数据; 在我们的例子中,它是一个消息变量。 模板引擎将数据与 HTML 结构合并。

`templates/hello/index.html.twig`

W
wizardforcel 已提交
203
```php
W
wizardforcel 已提交
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello</title>
  </head>
  <body>
    {{ message }}
  </body>
</html>

```

这是 Twig 模板文件。

W
wizardforcel 已提交
219
```php
W
wizardforcel 已提交
220 221 222 223 224 225
{{ message }}

```

`{{ }}`是一种特殊的 Twig 语法,它显示变量的内容。

W
wizardforcel 已提交
226
```php
W
wizardforcel 已提交
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
$ curl localhost:8000/twig
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello</title>
  </head>
  <body>
    Hello from Twig
  </body>
</html>

```

当我们连接到树枝路径时,我们将获得此 HTML 输出。

在本教程中,我们介绍了 Symfony 框架。

您可能也对以下相关教程感兴趣: [Symfony 表单教程](/symfony/form/)[Symfony 请求教程](/symfony/request/)[Twig 教程](/php/twig/)[PHP 教程](/lang/php/)

列出[所有 Symfony 教程](/all/#symfony)