路由是一個(gè)url到模塊->控制器->方法的映射。
注意:
在配置symfony路由的時(shí)候,如果入口文件用的是app.php由于處于生產(chǎn)模式,symfony會(huì)緩存路由配置,所以新配的路由可能會(huì)不生效(被坑了一會(huì)兒),可以暴力的直接清空app/cache文件夾,當(dāng)然如果使用app_dev.php作為入口文件,由于處于開(kāi)發(fā)模式,symfony并不會(huì)緩存路由
初級(jí)
symfony的路由共有四種配置方式,分別是annotation、yml、xml、php。配置文件的優(yōu)先級(jí)高于annotation
比如我們定義一個(gè)簡(jiǎn)單的路由/category/show用來(lái)展示目錄對(duì)應(yīng)的控制器是CategoryController.php,方法是showAction()
- annotation 是通過(guò)注釋的方式定義路由的,很靈活。
// src/AppBundle/Controller/CategoryController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class CategoryController extends Controller{
/**
* @Route("/category/show")
*/
public function showAction()
{
// ...
}
}
- yml 通過(guò)配置目錄中的
routing.yml來(lái)定義,(小心格式,_controller表示控制器,后面一定要有空格)
// app/config/routing.yml
category_show:
path: /category/show
defaults: { _controller: AppBundle:category:show }
- xml 我們也可以使用xml文檔進(jìn)行定義路由
<!-- app/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing
http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="category_show" path="/category/show">
<default key="_controller">AppBundle:Category:show</default>
</route>
</routes>
- php配置路由
// app/config/routing.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('category_show', new Route('/category/show', array( '_controller' => 'AppBundle:Category:show',)));
return $collection;
在切換xml,yml,php的時(shí)候,要在config/config.yml中進(jìn)行配置,以加載路由文件,修改resource的值。

config.yml
進(jìn)化
由于后兩種不夠直觀,所以還是前兩種使用的比較多。下面將來(lái)點(diǎn)動(dòng)態(tài)路由,以及路由格式限定。

來(lái)張大概格式
還有個(gè)
name字段,給路由起名字,以方便我們后面生成urlname="cate_show"一定要注意格式,雙引號(hào),單引號(hào)是不行的。還有
:后面最好有個(gè)空格

這個(gè)是不是更加簡(jiǎn)潔了
路由是怎么匹配的呢?

兩個(gè)差不多的路由
此時(shí)你會(huì)發(fā)現(xiàn),不管你怎么匹配,永遠(yuǎn)只能匹配到
delAction(),路由的匹配是按順序匹配的,如果當(dāng)前的路由是符合的,就不會(huì)再往下搜索,即使我們?cè)L問(wèn)www.xxx.com/del/del 你會(huì)發(fā)現(xiàn),還是匹配的delAction(),所以定義路由還是要謹(jǐn)慎的。
那么問(wèn)題來(lái)了,如果我非要匹配searchAction()怎么辦呢? 我們可以約束delAction()的參數(shù)格式,由于是根據(jù)id進(jìn)行刪除的,我們可以將其定義為數(shù)字

約束`id`的格式
這時(shí),我們就可以通過(guò)www.xxx.com/del/del來(lái)訪問(wèn)serachAction()了。