1

我习惯了 Yii 的 URL 管理:

site.com/controller/action/var1/value1/var2/value2

这样我就可以在 URL 中以任何顺序放置变量,或者省略一个并分配一个默认值:

public function actionFoo( $var1=22, $var2 ) { //Var1 is optional, Var2 must come.
}

Symfony中有这样的东西吗?我已经搜索过,但我只找到了硬编码的 URL 位置,比如 CodeIgniter,这让我觉得很烦人,因为如果我在 URL 的中间有一个参数,我需要给它一个值。

例子:

site.com/controller/action/false/false/value3

也许我习惯的也是一种不好的做法,我愿意以其他方式学习。

谢谢

4

2 回答 2

1

Symfony 不是这样工作的。

如果需要将值映射到变量名,则需要使用查询字符串:?var1=value1&var2=value2.

然后,在您的控制器中,您可以执行$this->get('request')->query->get('var1', false)(如果未设置false,则为默认值)。var1

否则,您可以在路由中定义默认值,但它不会按照您期望的方式工作。

你可以扩展路由组件来模仿 Yii 的路由系统,但我不建议这样做,因为这需要一些时间。

总而言之,查询字符串将完全符合您的期望。

于 2013-10-14T02:01:02.193 回答
1

我也发现它也有点烦人,但是通过一些工作,您可以通过将多个路由设置到同一个控制器方法来使 URL 在 Symfony 中工作。问题是顺序很重要。

此示例使用注释,但您可以使用 YAML、XML 和 PHP 做同样的事情。

/**
 * @Route("/whatever/{var2}/{var1}", name="whatever_allvars")
 * @Route("/whatever/{var2}", name="whatever_onevar")
 * @Template()
 */
public function actionFoo( $var1=22, $var2 ) { 
   //Var1 is optional, Var2 must come.
}

这将允许以下 URL:

site.com/whatever/var2/var1
site.com/whatever/var2

如果你真的想让它与示例 URL 匹配,你可以像这样设置它。

/**
 * @Route("/controller/action/var1/{var1}/var2/{var2}", name="whatever_allvars")
 * @Route("/controller/action/var1/{var1}", name="whatever_onevar")
 * @Template()
 */
public function actionFoo( $var1, $var2=22 ) { 
   //Var2 is optional, Var1 must come.
}

这将允许以下 URL:

site.com/controller/action/var1/value1/var2/value2
site.com/controller/action/var1/value1

希望这能让您了解在 Symfony 中可以做什么。

于 2013-10-14T02:20:03.923 回答