# Symfony 请求教程

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

Symfony 请求教程展示了如何在 Symfony 中使用请求对象。 我们展示了几种在 Symfony 中创建请求对象的方法。

## Symfony

Symfony 是一组可重用的 PHP 组件和一个用于 Web 项目的 PHP 框架。 Symfony 于 2005 年发布为免费软件。Symfony 的原始作者是 Fabien Potencier。 该框架的开发由 Frech 公司 Sensio Labs 赞助。

## Symfony `HttpFoundation`组件

Symfony `HttpFoundation`组件为 HTTP 规范定义了一个面向对象的层。 该组件以面向对象的方式表示请求/响应过程。 在最低级别上，我们具有 PHP 全局变量，例如`$_GET`，`$_POST`或`$_FILES`。 这些由`Request`对象表示。 响应由`Response`对象表示。

## Symfony 请求示例

在下面的示例中，我们使用链接创建三个不同的请求。

```php
$ composer create-project symfony/skeleton symreq

```

使用`composer`，我们创建一个新的 Symfony 骨架项目。

```php
$ cd symreq

```

我们转到项目目录。

```php
$ composer req annotations twig

```

我们安装模块`annotations`和`twig`。

```php
$ composer req maker server --dev

```

我们安装制造商组件和开发 Web 服务器。

```php
$ php bin/console make:controller HomeController

```

创建了`HomeController`。

`src/Controller/HomeController.php`

```php
<?php

namespace App\Controller;

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

class HomeController extends AbstractController
{
    /**
     * @Route("/", name="home")
     */
    public function index()
    {
        return $this->render('home/index.html.twig');
    }
}

```

`HomeController`返回一个包含锚标记的主页。

`templates/home/index.html.twig`

```php
{% extends 'base.html.twig' %}

{% block title %}Home page{% endblock %}

{% block body %}

<ul>
<li><a href="/myapp?colour=yellow&day=Saturday">First request</a></li>
<li><a href="/myapp2?colour=green&day=Sunday">Second request</a></li>

<li><a href="/myapp3?colour=red&day=Monday">Third request</a></li>
</ul>

{% endblock %}

```

`HomeController`返回一个包含三个链接的主页。 每个链接都有两个查询参数。 它们指向不同的控制器方法。

```php
{% extends 'base.html.twig' %}

```

该模板继承自`base.html.twig`文件，该文件具有要共享的基本标记。

`templates/base.html.twig`

```php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
    </body>
</html>

```

`base.html.twig`模板包含其他模板文件共享的代码。 它定义了将在子模板中替换的块。

```php
$ php bin/console make:controller MyappController

```

创建了`MyappController`。

`src/Controller/MyappController.php`

```php
<?php

namespace App\Controller;

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

class MyappController extends AbstractController
{
   /**
     * @Route("/myapp", name="myapp")
     */
    public function process()
    {
        $request = Request::createFromGlobals();
        $col = $request->query->get("colour");
        $day = $request->query->get("day");

        $content = "Colour: $col, day: $day";

        return new Response($content);
    }

    /**
     * @Route("/myapp2", name="myapp2")
     */
    public function process2()
    {
        $request = new Request(
            $_GET,
            $_POST,
            array(),
            $_COOKIE,
            $_FILES,
            $_SERVER
        );

        $col = $request->query->get("colour");
        $day = $request->query->get("day");

        $content = "Colour: $col, day: $day";

        return new Response($content);
    }    

    /**
     * @Route("/myapp3", name="myapp3")
     */
    public function process3(Request $request)
    {
        $data = $request->query->all();

        $col = $data["colour"];
        $day = $data["day"];

        $content = "Colour: $col, day: $day";

        return new Response($content);        
    }    
}

```

`MyappController`处理由链接创建的三个 GET 请求。

```php
$request = Request::createFromGlobals();
$col = $request->query->get("colour");
$day = $request->query->get("day");

```

使用`Request::createFromGlobals()`创建请求对象。 使用`get()`方法检索 GET 参数。

```php
$request = new Request(
    $_GET,
    $_POST,
    array(),
    $_COOKIE,
    $_FILES,
    $_SERVER
);

```

在第二种情况下，使用`new`关键字创建请求。 它通过 PHP 全局变量传递。

```php
public function process3(Request $request)
{
    $data = $request->query->all();
...    

```

在第三种情况下，使用 Symfony 的依赖项注入来注入请求对象。 我们使用`all()`方法从请求中获取所有参数。

```php
$col = $data["colour"];
$day = $data["day"];

```

从数组中，我们得到值。

```php
$content = "Colour: $col, day: $day";

return new Response($content);  

```

我们构建内容并返回`Response`对象。

在本教程中，我们处理了 Symfony 中的请求。

您可能也对以下相关教程感兴趣： [Symfony 简介](/symfony/intro/)， [Symfony 邮件教程](/symfony/main/)， [Symfony 创建路由](/symfony/createroutes/)， [Symfony 表单教程](/symfony/form/) ， [PHP 教程](/lang/php/)。