在呈现模板期间引发了Symfony2异常(“路由的参数必须匹配”“[^/]++”“才能生成相应的URL.”)


Symfony2 exception has been thrown during the rendering of a template ("Parameter for route must match "[^/]++" to generate a corresponding URL.")

当在对象名称中使用反斜杠并希望通过对象URL:时,我一直收到以下错误

在/ObjectBundle/Resources/views/object/index.html.titch中呈现模板期间引发异常(路由"object_show"的"参数"名称必须匹配"[^/]++"(给定"黑/白")才能生成相应的URL

控制器

/**
 * @Route("/show/{user}/{name}", name="object_show")
 * @Template()
 */
public function showAction($user, $name, Request $request)
{
    $user = $this->getDoctrine()->getRepository('UserBundle:User')
                 ->findBy(['username'=> $user]);
    $object = $this->getDoctrine()->getRepository('ObjectBundle:Object')
                   ->findOneBy(['name' => $name, 'user' => $user]);
    return array('object' => $object);
}

如何允许对对象名称使用反斜杠并能够生成相应的URL?

模板

      {% for object in objects %}
        <div class="item" id="object_{{ object.id }}">
            <a href="{{ path('object_show',
                     {'user': object.user.username, 'name' : object.name }) }}">
                <div class="title">{{ object.name }}</div>
            </a>
        </div>

您需要将, requirements={"name"=".+"}部件添加到您的路线定义中。例如:

/**
 * @Route("/show/{user}/{name}", name="object_show", requirements={"name"=".+"})
 * @Template()
 */
public function showAction($user, $name, Request $request)

请参阅手册部分:手册。

路由与正则表达式匹配。

"[^/]++"是变量值需要匹配的默认模式。它将匹配所有不是/的内容。您将得到一个异常,因为作为name传递的值是black/white(因此它包含一个不允许的/)。

如果数值不正确,请将其清除。

如果值是正确的,并且您确实需要匹配它,那么您可以更改name参数的要求。例如:

/**
 * @Route(
 *     "/show/{user}/{name}",
 *     name="object_show",
 *     requirements={"name": ".+"}
 * )
 */

它可以接受任何字符,所以如果这是你真正想要的,请小心。您需要根据自己的需要调整需求。

相关路由文档可在此处找到:

  • 添加要求
  • 参数中的斜杠