Symfony Newb路由问题

时间:2013-02-02 22:34:54

标签: symfony

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

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

如果我去速度/社交/或速度/社交/ bob或速度/社交/驱动程序/或速度/社交/驱动程序/ bob所有这些页面呈现没有问题。但是我需要传入名称,所以我改变了

public function unlimitedAction()
{ 

public function unlimitedAction($name)
{

如果我去速度/社交/司机/或速度/社交/司机/鲍勃它返回罚款。但是,如果我去速度/社交/然后我得到以下错误:

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

能够将变量传递给操作而不会出错。

谢谢!

1 个答案:

答案 0 :(得分:2)

要回答您的问题:您必须为网址中没有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//social/foo以及/social/drivers//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

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