Symfony Route 属性
最后修改时间:2025年3月3日
Symfony Route 属性教程展示了如何在 Symfony 7.2 中使用 Route 属性创建路由。
Symfony
Symfony 是一套可重用的 PHP 组件,也是一个用于 Web 项目的 PHP 框架。Symfony 于 2005 年发布为自由软件。Fabien Potencier 是 Symfony 的最初作者。Symfony 在很大程度上受到了 Spring 框架的启发。
Route 属性
路由是将 URL 路径映射到控制器的机制。例如,/about
URL 被映射到 MyController
的 about
方法。
#[Route]
属性是 PHP 8+ 和 Symfony 7.2 中创建路由的现代方法。它取代了旧的 @Route
注解语法,并提供了更好的 IDE 支持和类型安全。其他选项仍然可用,例如 XML 和 YAML 配置文件。
Symfony Route 示例
在下面的示例中,我们使用了 #[Route]
的各种选项。
$ composer create-project symfony/skeleton routeattr "^7.2" $ cd routeattr
使用 composer
,我们创建一个新的 Symfony 7.2 骨架项目。然后我们导航到项目目录。
$ composer require symfony/maker-bundle --dev
我们安装 maker-bundle
。请注意,路由属性已内置于 Symfony 7.2 中,无需单独的 annotations 包。
$ php bin/console make:controller MyController
创建了一个 MyController
。
<?php declare(strict_types=1); namespace App\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class MyController extends AbstractController { #[Route(path: '/home', name: 'my_home')] public function home(): Response { return new Response('home', Response::HTTP_OK, ['content-type' => 'text/plain']); } #[Route(path: '/about', name: 'my_about', methods: ['GET', 'POST'])] public function about(Request $request): Response { $method = $request->getMethod(); $msg = "about: $method"; return new Response($msg, Response::HTTP_OK, ['content-type' => 'text/plain']); } #[Route(path: '/news/{id}', name: 'my_news', requirements: ['id' => '\d+'])] public function news(int $id): Response { $msg = "News $id"; return new Response($msg, Response::HTTP_OK, ['content-type' => 'text/plain']); } }
MyController
使用 #[Route]
创建了三个路由。
#[Route(path: '/home', name: 'my_home')] public function home(): Response { return new Response('home', Response::HTTP_OK, ['content-type' => 'text/plain']); }
在这里,我们使用带命名参数的现代属性语法将 /home
路径映射到 home()
方法。
#[Route(path: '/about', name: 'my_about', methods: ['GET', 'POST'])] public function about(Request $request): Response { $method = $request->getMethod(); $msg = "about: $method"; return new Response($msg, Response::HTTP_OK, ['content-type' => 'text/plain']); }
通过 methods
选项,我们将请求限制为 GET 和 POST。
#[Route(path: '/news/{id}', name: 'my_news', requirements: ['id' => '\d+'])] public function news(int $id): Response { $msg = "News $id"; return new Response($msg, Response::HTTP_OK, ['content-type' => 'text/plain']); }
通过 requirements
选项和类型提示,我们确保 id
是一个整数。属性语法使用命名参数以提高清晰度。
也可以将 Route 属性放置在控制器类上作为前缀。
$ php bin/console make:controller TestController
我们创建一个新的控制器。
<?php declare(strict_types=1); namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; #[Route(path: '/test', name: 'test_')] class TestController extends AbstractController { #[Route(path: '/car', name: 'car')] public function car(): Response { $msg = 'Testing car'; return new Response($msg, Response::HTTP_OK, ['content-type' => 'text/plain']); } #[Route(path: '/book', name: 'book')] public function book(): Response { $msg = 'Testing book'; return new Response($msg, Response::HTTP_OK, ['content-type' => 'text/plain']); } }
TestController
在类级别使用了带名称前缀的 #[Route]
。URL 路径将变为 /test/car
和 /test/book
,路由名称分别为 test_car
和 test_book
。
$ php bin/console debug:router --------------- ---------- -------- ------ ------------ Name Method Scheme Host Path --------------- ---------- -------- ------ ------------ my_home ANY ANY ANY /home my_about GET|POST ANY ANY /about my_news ANY ANY ANY /news/{id} test_car ANY ANY ANY /test/car test_book ANY ANY ANY /test/book --------------- ---------- -------- ------ ------------
我们可以使用 bin/console debug:router
命令列出已创建的路由。
运行示例
我们启动服务器,并使用 curl
工具测试创建的路由。
$ php bin/console server:start
我们启动开发服务器。
$ 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
生成请求。
在本教程中,我们使用现代的 #[Route]
属性语法和严格的类型来创建 Symfony 7.2 中的路由。
列出 所有 Symfony 教程。