symfony2 路由篇

路由是一个url到模块->控制器->方法的映射。

注意:

在配置symfony路由的时候,如果入口文件用的是app.php由于处于生产模式,symfony会缓存路由配置,所以新配的路由可能会不生效(被坑了一会儿),可以暴力的直接清空app/cache文件夹,当然如果使用app_dev.php作为入口文件,由于处于开发模式,symfony并不会缓存路由

初级

symfony的路由共有四种配置方式,分别是annotationymlxmlphp。配置文件的优先级高于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文档进行定义路由



 
    
        AppBundle:Category:show
    

  • 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的值。

symfony2 路由篇_第1张图片
config.yml

进化

由于后两种不够直观,所以还是前两种使用的比较多。下面将来点动态路由,以及路由格式限定。

symfony2 路由篇_第2张图片
来张大概格式

还有个 name字段,给路由起名字,以方便我们后面生成url
name="cate_show"
一定要注意格式,双引号,单引号是不行的。还有后面最好有个空格

symfony2 路由篇_第3张图片
这个是不是更加简洁了

路由是怎么匹配的呢?

symfony2 路由篇_第4张图片
两个差不多的路由

此时你会发现,不管你怎么匹配,永远只能匹配到 delAction(),路由的匹配是按顺序匹配的,如果当前的路由是符合的,就不会再往下搜索,即使我们访问 www.xxx.com/del/del 你会发现,还是匹配的 delAction(),所以定义路由还是要谨慎的。

那么问题来了,如果我非要匹配searchAction()怎么办呢? 我们可以约束delAction()的参数格式,由于是根据id进行删除的,我们可以将其定义为数字

symfony2 路由篇_第5张图片
约束`id`的格式

这时,我们就可以通过www.xxx.com/del/del来访问serachAction()了。

你可能感兴趣的:(symfony2 路由篇)