原文: 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 映射到MyControllerabout()方法。

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

Symfony @Route示例

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

  1. $ composer create-project symfony/skeleton routeanno
  2. $ cd routeanno

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

  1. $ composer require maker
  2. $ composer require annotations

我们安装了两个模块:annotationsmaker@Routeannotations模块中定义。

  1. $ composer require server --dev

我们安装开发 Web 服务器。

  1. $ php bin/console make:controller MyController

创建了MyController

src/Controller/MyController.php

  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. class MyController extends AbstractController
  8. {
  9. /**
  10. * @Route("/home")
  11. */
  12. public function home()
  13. {
  14. return new Response("home", Response::HTTP_OK,
  15. ['content-type' => 'text/plain']);
  16. }
  17. /**
  18. * @Route("/about", methods={"GET", "POST"})
  19. */
  20. public function about(Request $request)
  21. {
  22. $method = $request->getRealMethod();
  23. $msg = "about: " . $method;
  24. return new Response($msg, Response::HTTP_OK,
  25. ['content-type' => 'text/plain']);
  26. }
  27. /**
  28. * @Route("/news/{id}", requirements={"page"="\d+"})
  29. */
  30. public function news($id)
  31. {
  32. $msg = 'News ' . $id;
  33. return new Response($msg, Response::HTTP_OK,
  34. ['content-type' => 'text/plain']);
  35. }
  36. }

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

  1. /**
  2. * @Route("/home")
  3. */
  4. public function home()
  5. {
  6. return new Response("home", Response::HTTP_OK,
  7. ['content-type' => 'text/plain']);
  8. }

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

  1. /**
  2. * @Route("/about", methods={"GET", "POST"})
  3. */
  4. public function about(Request $request)
  5. {
  6. $method = $request->getRealMethod();
  7. $msg = "about: " . $method;
  8. return new Response($msg, Response::HTTP_OK,
  9. ['content-type' => 'text/plain']);
  10. }

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

  1. /**
  2. * @Route("/news/{id}", requirements={"page"="\d+"})
  3. */
  4. public function news($id)
  5. {
  6. $msg = 'News ' . $id;
  7. return new Response($msg, Response::HTTP_OK,
  8. ['content-type' => 'text/plain']);
  9. }

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

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

  1. $ php bin/console make:controller TestController

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

src/Controller/TestController.php

  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Component\HttpFoundation\Response;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. /**
  7. * @Route("/test")
  8. */
  9. class TestController extends AbstractController
  10. {
  11. /**
  12. * @Route("/car")
  13. */
  14. public function car()
  15. {
  16. $msg = 'Testing car';
  17. return new Response($msg, Response::HTTP_OK,
  18. ['content-type' => 'text/plain']);
  19. }
  20. /**
  21. * @Route("/book")
  22. */
  23. public function book()
  24. {
  25. $msg = 'Testing book';
  26. return new Response($msg, Response::HTTP_OK,
  27. ['content-type' => 'text/plain']);
  28. }
  29. }

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

  1. $ php bin/console debug:router
  2. --------------- ---------- -------- ------ ------------
  3. Name Method Scheme Host Path
  4. --------------- ---------- -------- ------ ------------
  5. app_my_home ANY ANY ANY /home
  6. app_my_about GET|POST ANY ANY /about
  7. app_my_news ANY ANY ANY /news/{id}
  8. app_test_car ANY ANY ANY /test/car
  9. app_test_book ANY ANY ANY /test/book
  10. --------------- ---------- -------- ------ ------------

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

运行示例

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

  1. $ php bin/console server:run

我们启动开发服务器。

  1. $ curl localhost:8000/home
  2. home
  3. $ curl -X POST localhost:8000/about
  4. about: POST
  5. $ curl localhost:8000/news/34
  6. News 34
  7. $ curl localhost:8000/test/car
  8. Testing car
  9. $ curl localhost:8000/test/book
  10. Testing book

我们使用curl生成请求。

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

您可能也对以下相关教程感兴趣: Symfony 简介Symfony 创建路由Symfony 表单教程PHP 教程