2013-03-05 46 views
2

应用程序/配置/ routing_dev.yml:Symfony2的默认路由占位

people: 
    resource: "@myPeopleBundle/Resources/config/routing.yml" 
    prefix: /people 

myPeopleBundle /资源/配置/ routing.yml中:

people_homepage: 
    pattern: /{name} 
    defaults: { _controller: myPeopleBundle:Default:index, name: Foo } 

people_homepage2: 
    pattern:/
    defaults: { _controller: myPeopleBundle:Default:index, name: Bar } 

myPeopleBundle:控制器:DefaultController.php:

... 
public function indexAction($name) { 
    return $this->render('myPeopleBundle:Default:index.html.twig', array('name' => $name)); 
} 
... 

myPeopleBundle:Default:index.html.twig:

Hello {{ name }}! 

web/app_dev.php/people ->你好富!
web/app_dev.php/people/ -> Hello Bar!

它为什么不同? people_homepage路由为什么不匹配第二个(web/app_dev.php/people/)url?

但如果我设置prefix/我得到的结果相同:
web/app_dev.php ->你好富!
web/app_dev.php/ -> Hello Foo!

回答

3

如果你看看appdevUrlMatcher.php,你会看到这样的事情:

// people_homepage 
    if (preg_match('#^/people(?:/(?P<name>[^/]++))?$#s', $pathinfo, $matches)) { 
     return $this->mergeDefaults(array_replace($matches, array('_route' => 'people_homepage')), array ( '_controller' => 'Acme\\DemoBundle\\Controller\\DefaultController::indexAction', 'name' => 'Foo',)); 
    } 

    // people_homepage2 
    if (rtrim($pathinfo, '/') === '/people') { 
     if (substr($pathinfo, -1) !== '/') { 
      return $this->redirect($pathinfo.'/', 'people_homepage2'); 
     } 

     return array ( '_controller' => 'Acme\\DemoBundle\\Controller\\DefaultController::indexAction', 'name' => 'Bar', '_route' => 'people_homepage2',); 
    } 

你可以看到,该路线/people/不能有不匹配people_homepage,但它会随着/people/people/test

因为你正在做的事情会更有意义,如果你改变路线的顺序

people_homepage2: 
    pattern:/
    defaults: { _controller: myPeopleBundle:Default:index, name: Bar } 

people_homepage: 
    pattern: /{name} 
    defaults: { _controller: myPeopleBundle:Default:index, name: Foo } 

有了这个配置,你将有:

/people == /people/ --->people_homepage2

/people/test --->people_homepage