🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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/)。