有没有办法在Symfony2 2.3路由占位符中使用连字符?

时间:2015-03-30 16:04:36

标签: php symfony routing

我正在尝试在路由占位符中使用带连字符的名称,例如new-jersey,但我收到404错误。当我在占位符中使用单个世界时,例如illinois,路由可以正常工作。

这是因为PHP通过尝试处理new-jersey等带连字符的占位符变量而错误输出?有没有办法可以将带连字符的变量传递给路由占位符?

我的相关路线设置如下:

# routing.yml
bar_exam_show:
    path: /pass-the-bar-exam/{statePath}-bar-exam
    defaults: { _controller: AppBundle:BarExams:show }

所以回顾一下:

/illinois-bar-exam          #200 OK
/new-jersey-bar-exam        #404 Not Found
/district-of-columbia       #404 Not Found

修改 - UrlMatcher.php的内容

if (0 === strpos($pathinfo, '/pass-the-bar-exam')) {
    // bar_exams_index
    if ($pathinfo === '/pass-the-bar-exam') {
        return array (  '_controller' => 'AppBundle\\Controller\\BarExamsController::indexAction',  '_route' => 'bar_exams_index',);
    }

    // bar_exams_show
    if (preg_match('#^/pass\\-the\\-bar\\-exam/(?P<statePath>[^/\\-]++)\\-bar\\-exam$#s', $pathinfo, $matches)) {
        return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar_exams_show')), array (  '_controller' => 'AppBundle\\Controller\\BarExamsController::showAction',));
    }

}

1 个答案:

答案 0 :(得分:1)

奇怪的是,symfony在缓存中添加了连字符的排除。你必须使用更旧的版本,因为它不再那样做了。

无论如何,添加此要求应覆盖默认表达式。

bar_exam_show:
    path: /pass-the-bar-exam/{statePath}-bar-exam
    defaults: { _controller: AppBundle:BarExams:show }
    requirements:
        page:  [^\/]+