我刚刚开始使用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
能够将变量传递给操作而不会出错。
谢谢!
答案 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
作为一般规则,每个方法(每个动作)应该专注于做一件事,并且应该尽可能短。使用服务并让您的控制器完成他们应该做的事情:了解用户输入,呼叫服务和显示视图。