- Symfony 教程
- Symfony - 首页
- Symfony - 简介
- Symfony - 安装
- Symfony - 架构
- Symfony - 组件
- Symfony - 服务容器
- Symfony - 事件 & 事件监听器
- Symfony - 表达式
- Symfony - Bundles
- 创建简单的 Web 应用程序
- Symfony - 控制器
- Symfony - 路由
- Symfony - 视图引擎
- Symfony - Doctrine ORM
- Symfony - 表单
- Symfony - 验证
- Symfony - 文件上传
- Symfony - Ajax 控制
- Cookie & 会话管理
- Symfony - 国际化
- Symfony - 日志记录
- Symfony - 邮件管理
- Symfony - 单元测试
- Symfony - 高级概念
- Symfony - REST 版本
- Symfony - CMF 版本
- 完整的运行示例
- Symfony 有用资源
- Symfony - 快速指南
- Symfony - 有用资源
- Symfony - 讨论
Symfony - 路由
路由将请求 URI 映射到特定控制器的某个方法。一般来说,任何 URI 都有以下三个部分:
- 主机名段
- 路径段
- 查询段
例如,在 URI/URL https://tutorialspoint.com/index?q=data 中,www.tutorialspoint.com 是主机名段,index 是路径段,q=data 是查询段。通常,路由会根据一组约束检查页面段。如果任何约束匹配,则它会返回一组值。其中一个主要值是控制器。
注解
注解在 Symfony 应用程序的配置中起着重要作用。注解通过在代码本身中声明配置来简化配置。注解只不过是提供关于类、方法和属性的元信息。路由广泛使用注解。即使路由可以在没有注解的情况下完成,注解在很大程度上简化了路由。
以下是一个注解示例。
/** * @Route(“/student/home”) */ public function homeAction() { // ... }
路由概念
考虑在“student”项目中创建的 StudentController 类。
StudentController.php
// src/AppBundle/Controller/StudentController.php namespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class StudentController extends Controller { /** * @Route(“/student/home”) */ public function homeAction() { // ... } /** * @Route(“/student/about”) */ public function aboutAction() { } }
在这里,路由执行两个步骤。如果您访问 /student/home,则第一个路由匹配,然后执行 homeAction()。否则,如果您访问 /student/about,则第二个路由匹配,然后执行 aboutAction()。
添加通配符格式
假设您有一个学生记录的分页列表,其 URL 类似于 /student/2 和 /student/3,分别对应第 2 页和第 3 页。然后,如果要更改路由的路径,可以使用通配符格式。
示例
// src/AppBundle/Controller/BlogController.php namespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class StudentController extends Controller { /** * @Route(“/student/{page}", name = “student_about”, requirements = {"page": "\d+"}) */ public function aboutAction($page) { // ... } }
这里,\d+ 是一个正则表达式,匹配任何长度的数字。
分配占位符
您可以在路由中分配占位符值。定义如下。
// src/AppBundle/Controller/BlogController.php namespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class StudentController extends Controller { /** * @Route(“/student/{page}", name = “student_about”, requirements = {"page": "\d+"}) */ public function aboutAction($page = 1) { // ... } }
在这里,如果您访问 /student,student_about 路由将匹配,并且 $page 将默认为值 1。
重定向到页面
如果要将用户重定向到另一个页面,请使用 redirectToRoute() 和 redirect() 方法。
public function homeAction() { // redirect to the "homepage" route return $this->redirectToRoute('homepage'); // redirect externally \return $this->redirect('http://example.com/doc'); }
生成 URL
要生成 URL,请考虑路由名称 student_name 和在该路由的路径中使用的通配符名称 student-names。生成 URL 的完整列表定义如下。
class StudentController extends Controller { public function aboutAction($name) { // ... // /student/student-names $url = $this->generateUrl( ‘student_name’, array(‘name’ => ’student-names’) ); } }
StudentController
考虑一个在 StudentController 类中进行路由的简单示例,如下所示。
StudentController.php
<?php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class StudentController { /** * @Route("/student/home") */ public function homeAction() { $name = 'Student details application'; return new Response( '<html><body>Project: '.$name.'</body></html>' ); } }
现在,请求 url ”https://127.0.0.1:8000/student/home”,它会产生以下结果。
类似地,您也可以为 aboutAction() 创建另一个路由。