0

我刚刚开始使用 Symfony,但遇到了路由问题。这是来自控制器的路由:

/**
 * @Route("/social/{name}/", name="_speed1")
 * @Route("/social/drivers/")
 * @Route("/social/drivers/{name}/", name="_driver")
 * @Route("/social/", name="_speed")
 * @Template()
 */
public function unlimitedAction()
{

如果我去 speed/social/ 或 speed/social/bob 或 speed/social/drivers/ 或 speed/social/drivers/bob 所有这些页面都可以毫无问题地呈现。但是我需要传入的名字所以我改变了

public function unlimitedAction()
{ 

public function unlimitedAction($name)
{

如果我去 speed/social/drivers/ 或 speed/social/drivers/bob 它返回正常。但是,如果我转到 speed/social/,则会收到以下错误:

Controller "MyBundle\Controller\DefaultController::unlimitedAction()" 
requires that you provide a value for the "$name" argument (because there is 
no default value or because there is a non optional argument after this one).

我不明白为什么它适用于一条路线而不适用于另一条路线。

所以我的问题是,我怎样才能实现我的路由,以便我可以去:

speed/social/
speed/social/drivers/
speed/social/drivers/bob

并且能够将变量传递给动作而不会出错。

谢谢!

4

1 回答 1

2

要回答您的问题:您必须为每个在 url 中name没有参数的路由提供参数的默认值。{name}我现在无法测试它,我不记得使用注释时的语法,但应该是这样的:

/**
 * @Route("/social/{name}/", name="_speed1", defaults={"name"=null})
 * @Route("/social/drivers/{name}/", name="_driver", defaults={"name"=null})
 * @Template()
 */
public function unlimitedAction($name)
{
}

这样,您应该可以调用/social/and/social/foo以及/social/drivers/and /social/drivers/foo

但是,真的,这不是正确的方法。只需定义更多操作,每个操作都绑定到单个路由:

/**
 * @Route("/social", name="social_index")
 * @Template()
 */
public function socialIndexAction() { } // /social

/**
 * @Route("/social/{name}", name="social_show")
 * @Template()
 */
public function socialShowAction($name) { } // /social/foo

作为一般规则,每个方法(每个动作)都应该专注于做一件事,并且应该尽可能短。使用服务并让你的控制器做他们应该做的事情:理解用户输入、调用服务和显示视图。

于 2013-02-02T23:36:30.117 回答