# Symfony `@Route`注解教程

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

Symfony `@Route`注解教程展示了如何在 Symfony 中使用`@Route`注解创建路由。

## Symfony

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

## `@Route`注解

路由是从 URL 路径到控制器的映射。 例如，`/about` URL 映射到`MyController`的`about()`方法。

`@Route`注解用于创建路径。 其他选项是 XML 和 YAML 配置文件以及 PHP 代码。 该注解用于文档字符串中。

## Symfony `@Route`示例

在下面的示例中，我们使用`@Route`的各种选项。

```php
$ composer create-project symfony/skeleton routeanno
$ cd routeanno

```

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

```php
$ composer require maker
$ composer require annotations

```

我们安装了两个模块：`annotations`和`maker`。 `@Route`在`annotations`模块中定义。

```php
$ composer require server --dev

```

我们安装开发 Web 服务器。

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

```

创建了`MyController`。

`src/Controller/MyController.php`

```php
<?php

namespace App\Controller;

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

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

    /**
     * @Route("/about", methods={"GET", "POST"})
     */
    public function about(Request $request)
    {
        $method = $request->getRealMethod();
        $msg = "about: " . $method;

        return new Response($msg,  Response::HTTP_OK,
            ['content-type' => 'text/plain']);
    }    

    /**
     * @Route("/news/{id}", requirements={"page"="\d+"})
     */
    public function news($id)
    {
        $msg = 'News ' . $id;

        return new Response($msg,  Response::HTTP_OK,
            ['content-type' => 'text/plain']);
    }    
}

```

`MyController`具有使用`@Route`创建的三个路由。

```php
/**
* @Route("/home")
*/
public function home()
{
    return new Response("home",  Response::HTTP_OK,
        ['content-type' => 'text/plain']);
}

```

在这里，我们将`/home`路径映射到`home()`方法。

```php
/**
* @Route("/about", methods={"GET", "POST"})
*/
public function about(Request $request)
{
    $method = $request->getRealMethod();
    $msg = "about: " . $method;

    return new Response($msg,  Response::HTTP_OK,
        ['content-type' => 'text/plain']);
}

```

使用`methods`选项，我们可以将请求限制为指定的方法类型。 在我们的例子中，仅针对 GET 和 POST 请求才调用`about()`方法。

```php
/**
* @Route("/news/{id}", requirements={"page"="\d+"})
*/
public function news($id)
{
    $msg = 'News ' . $id;

    return new Response($msg,  Response::HTTP_OK,
        ['content-type' => 'text/plain']);
}

```

使用`requirements`选项，我们为 URL 路径指定允许的字符。 `{id}`是整数值的占位符。

也可以将注解放置在控制器类上。 这用作所有路由路径的前缀。

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

```

我们创建一个新的控制器。

`src/Controller/TestController.php`

```php
<?php

namespace App\Controller;

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

/**
 * @Route("/test")
 */
class TestController extends AbstractController
{
    /**
     * @Route("/car")
     */
    public function car()
    {
        $msg = 'Testing car';

        return new Response($msg,  Response::HTTP_OK,
            ['content-type' => 'text/plain']);
    }

    /**
     * @Route("/book")
     */
    public function book()
    {
        $msg = 'Testing book';

        return new Response($msg,  Response::HTTP_OK,
            ['content-type' => 'text/plain']);
    }
}

```

`TestController`带有`@Route("/test")`注解。 因此，URL 路径将为`/test/car`和`/test/book`。

```php
$ php bin/console debug:router
--------------- ---------- -------- ------ ------------
Name            Method     Scheme   Host   Path
--------------- ---------- -------- ------ ------------
app_my_home     ANY        ANY      ANY    /home
app_my_about    GET|POST   ANY      ANY    /about
app_my_news     ANY        ANY      ANY    /news/{id}
app_test_car    ANY        ANY      ANY    /test/car
app_test_book   ANY        ANY      ANY    /test/book
--------------- ---------- -------- ------ ------------

```

我们可以使用`bin/console debug:router`命令列出创建的路由。

### 运行示例

我们启动服务器并使用`curl`工具测试创建的路由。

```php
$ php bin/console server:run

```

我们启动开发服务器。

```php
$ curl localhost:8000/home
home
$ curl -X POST localhost:8000/about
about: POST
$ curl localhost:8000/news/34
News 34
$ curl localhost:8000/test/car
Testing car
$ curl localhost:8000/test/book
Testing book

```

我们使用`curl`生成请求。

In this tutorial we have created routes in Symfony using `@Route` annotation.

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