0

这是我的路由:

myapp_upgradeAccount:
    path:  /upgradeAccount
    defaults: { _controller: myapp:UpgradeAccount:index }

myapp_checkUsernameForUpgrade:
    path: /upgradeAccount/check/{username}
    defaults: { _controller: myapp:UpgradeAccount:checkUsername }
    methods: [GET]

这是我的表格

<form method="get" action="upgradeAccount/check">
    <label for="username">Insert your username:</label>
    <input name="username" type="text">
    <input id="chech-username-for-upgrade" class="green" type="submit" value="Check">
    ...

但是每次我提交表单时,我都会收到此错误:

No route found for "GET /upgradeAccount/check"

问题是当我提交表单时,我得到以下 URL:

http://localhost/app_dev.php/upgradeAccount/check?username=123

当我认为我应该得到

http://localhost/app_dev.php/upgradeAccount/check/123

如果我手动 trz 后者,它可以正常工作。我错过了什么?

4

3 回答 3

2

这就是 HTML 表单的工作方式。
来自w3.org

get:使用 HTTP“get”方法,表单数据集被附加到 action 属性指定的 URI(以问号(“?”)作为分隔符),并将这个新的 URI 发送到处理代理。

要保留该GET方法,您必须将路线定义为:

myapp_checkUsernameForUpgrade:
    path: /upgradeAccount/check
    defaults: { _controller: myapp:UpgradeAccount:checkUsername }
    methods: [GET]

在您的控制器中,您可以使用以下命令访问查询字符串参数:

if(!is_null($this->getRequest()->get('username'))
{
  //Do your stuff
}

编辑:

如果您希望您的用户被重定向到格式为 的 url upgradeAccount/check/{username},您可以使用 JavaScript(如@usoban 答案中的建议)或在控制器内部使用Redirect

//path:  /upgradeAccount/check
public function check()
{
  if(!is_null($this->get('request')->request->get('username')))
    return $this->redirect($this->generateUrl('myapp_checkUsernameForUpgrade', array('username' => $this->get('request')->request->get('username'))));

  //By default, return the view with your form asking the username
  return $this->render('AcmeHelloBundle:Hello:index.html.twig');
}

//path: /upgradeAccount/check/{username}
public function checkUsername($username)
{
  //Do some fun stuff with $username coming from the url
}

然后在您看来,表单签名变为:

<form method="post" action="upgradeAccount/check">
  <label for="username">Insert your username:</label>
  <input name="username" type="text">
  <!-- additionnal fields -->
  <input id="chech-username-for-upgrade" class="green" type="submit" value="Check">
</form>

还有你的路线:

myapp_check:
    path: /upgradeAccount/check
    defaults: { _controller: myapp:UpgradeAccount:check }
    methods: [POST]
myapp_checkUsernameForUpgrade:
    path: /upgradeAccount/check/{username}
    defaults: { _controller: myapp:UpgradeAccount:checkUsername }
    methods: [GET]
于 2013-07-02T16:10:44.067 回答
0

您需要生成带有参数的路由。所以你需要做

<form method="get" action="{{path('your_route_name', {username:'usernmae'})">

但是,这显然对您不起作用,因为您在输入用户名之前不知道用户名。您可以查看FOSJsRoutingBundle但这需要 javascript。不是最好的解决方案,但它会起作用。否则,您将需要删除用户名参数

于 2013-07-02T16:10:58.690 回答
0

正如@cheesemacfly 提到的,这就是表单的工作方式:)

为了让它自己醒来,我使用了一些 javascript。假设您正在使用 jQuery:

<form method="get" action="upgradeAccount/check/___username___" id="my_form">
...
    <input name="username" type="text" id="username">

$(document).ready(function(){
  $('#my_form').submit(function(evt){
      var username = $('#username').val(),   
          action   = $(this).attr('action').replace(/___username___/g, username);

      if (/* empty or whatever 'validation' */) {
        evt.preventDefault(); // stop the form from submitting
        return false;
      }      

      $(this).attr('action', action);
      return true;
  });
});
于 2013-07-02T18:25:55.723 回答