路由是一個url到模塊->控制器->方法的映射。
注意:
在配置symfony路由的時候,如果入口文件用的是app.php
由于處于生產(chǎn)模式,symfony
會緩存路由配置,所以新配的路由可能會不生效(被坑了一會兒),可以暴力的直接清空app/cache
文件夾,當(dāng)然如果使用app_dev.php
作為入口文件,由于處于開發(fā)模式,symfony
并不會緩存路由
初級
symfony的路由共有四種配置方式,分別是annotation
、yml
、xml
、php
。配置文件的優(yōu)先級高于annotation
比如我們定義一個簡單的路由/category/show
用來展示目錄對應(yīng)的控制器是CategoryController.php
,方法是showAction()
- annotation 是通過注釋的方式定義路由的,很靈活。
// 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 通過配置目錄中的
routing.yml
來定義,(小心格式,_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的時候,要在config/config.yml
中進(jìn)行配置,以加載路由文件,修改resource
的值。
config.yml
進(jìn)化
由于后兩種不夠直觀,所以還是前兩種使用的比較多。下面將來點(diǎn)動態(tài)路由,以及路由格式限定。
來張大概格式
還有個
name
字段,給路由起名字,以方便我們后面生成urlname="cate_show"
一定要注意格式,雙引號,單引號是不行的。還有
:
后面最好有個空格
這個是不是更加簡潔了
路由是怎么匹配的呢?
兩個差不多的路由
此時你會發(fā)現(xiàn),不管你怎么匹配,永遠(yuǎn)只能匹配到
delAction()
,路由的匹配是按順序匹配的,如果當(dāng)前的路由是符合的,就不會再往下搜索,即使我們訪問www.xxx.com/del/del
你會發(fā)現(xiàn),還是匹配的delAction()
,所以定義路由還是要謹(jǐn)慎的。
那么問題來了,如果我非要匹配searchAction()
怎么辦呢? 我們可以約束delAction()
的參數(shù)格式,由于是根據(jù)id
進(jìn)行刪除的,我們可以將其定義為數(shù)字
約束`id`的格式
這時,我們就可以通過www.xxx.com/del/del
來訪問serachAction()
了。