我如何在Symfony2路由中有可选参数

Ran*_*ngh 46 php routing symfony

我有以下代码:

/**
 * Lists all User entities.
 *
 * @Route("/{cid}",defaults={"cid" = null},name="user")
 * @Template()
 */
public function indexAction($cid=null)
{}
Run Code Online (Sandbox Code Playgroud)

现在,如果我键入site/user/1然后它可以工作,但如果我输入site/user/它说:

No route found
Run Code Online (Sandbox Code Playgroud)

我怎么能知道这两条路线都有效?

Ino*_*ryy 73

试着去site/user(注意最后没有反斜杠).

一般它应该工作,我有相对类似的配置工作.

但是如果所有其他方法都失败了,你总是可以为同一行动定义多条路线,即

/**
 * Lists all User entities.
 *
 * @Route("/", name="user_no_cid")
 * @Route("/{cid}", name="user")
 * @Template()
 */
public function indexAction($cid=null)
{
Run Code Online (Sandbox Code Playgroud)

  • 这只是在很短的时间内出现问题,但在参数上设置默认值(在这种情况下为`$cid`) - 非常重要:p (2认同)

fko*_*ler 37

使用yml文件作为路由配置,并在路由参数中添加id的默认值,如下所示:

user:
  pattern:   /site/user/{id}
  defaults:  { _controller: YourBundle:Default:index, id: 1 }
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档

  • 然而他的回答帮助了我和其他一些人 (8认同)
  • 关于将来的注意事项:在Symfony 3中不推荐使用`pattern`键 (4认同)
  • OP显然在控制器中使用路由注释 (3认同)
  • ...而你必须使用`path`键(SF3) (2认同)

crm*_*cco 6

你也可以用GET参数来做,例如

/**
 * @param Request $request
 *
 * @return Response
 */
public function displayDetailAction(Request $request) : Response
{
    if ($courseId = $request->query->get('courseId')) {
Run Code Online (Sandbox Code Playgroud)