路由是一个url到模块->控制器->方法的映射。
注意:
在配置symfony路由的时候,如果入口文件用的是app.php
由于处于生产模式,symfony
会缓存路由配置,所以新配的路由可能会不生效(被坑了一会儿),可以暴力的直接清空app/cache
文件夹,当然如果使用app_dev.php
作为入口文件,由于处于开发模式,symfony
并不会缓存路由
初级
symfony的路由共有四种配置方式,分别是annotation
、yml
、xml
、php
。配置文件的优先级高于annotation
比如我们定义一个简单的路由/category/show
用来展示目录对应的控制器是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文档进行定义路由
<!-- 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
中进行配置,以加载路由文件,修改resource
的值。
进化
由于后两种不够直观,所以还是前两种使用的比较多。下面将来点动态路由,以及路由格式限定。
还有个
name
字段,给路由起名字,以方便我们后面生成urlname="cate_show"
一定要注意格式,双引号,单引号是不行的。还有
:
后面最好有个空格
这个是不是更加简洁了
路由是怎么匹配的呢?
两个差不多的路由此时你会发现,不管你怎么匹配,永远只能匹配到
delAction()
,路由的匹配是按顺序匹配的,如果当前的路由是符合的,就不会再往下搜索,即使我们访问www.xxx.com/del/del
你会发现,还是匹配的delAction()
,所以定义路由还是要谨慎的。
那么问题来了,如果我非要匹配searchAction()
怎么办呢? 我们可以约束delAction()
的参数格式,由于是根据id
进行删除的,我们可以将其定义为数字
这时,我们就可以通过www.xxx.com/del/del
来访问serachAction()
了。
网友评论