Symfony路由


路由将请求URI映射到特定控制器的方法。一般来说,任何URI都有以下三部分 -

  • 主机名段
  • 路径段
  • 查询段

例如,在URI / URL中, http://www.CodingDict.com/index? q=data ,www.CodingDict.com 是主机名段,index是路径段,q = data是查询段。通常,路由会根据一组约束来检查页面段。如果任何约束匹配,则返回一组值。其中一个主要价值是控制器。

注释

注释在Symfony应用程序的配置中起着重要作用。注释通过在编码中声明配置来简化配置。注释只是提供有关类,方法和属性的元信息。路由广泛使用注释。尽管路由可以在没有注释的情况下完成,但注释很大程度上简化了路由。

以下是样本注释。

/**
   * @Route(“/student/home”)
*/
public function homeAction() {
   // ...
}

路由概念

考虑在“学生”项目中创建的 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() {
   }
}

这里,路由执行两个步骤。如果你去 /学生/ home ,第一条路线匹配,然后执行 homeAction() 。否则,如果您转到 / student / about ,则匹配第二条路线,然后执行 aboutAction()

添加通配符格式

考虑一下,你有一个分页的学生记录列表,其中第2页和第 3 页的URL分别为 / student / 2和/ student / 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,请考虑路由名称, student_name 和通配符名称,该路由路径中使用的 student-name 。生成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, “http:// localhost:8000 / student / home” ,并产生以下结果。

学生管理员

同样,您也可以为 aboutAction() 创建另一个路由。