Slugs无法在使用GET方法的Forms中工作

时间:2013-07-02 15:55:07

标签: symfony routing

这是我的路线:

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"

问题是,当我提交表单时,我会收到以下网址:

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

当我想我应该

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

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

3 个答案:

答案 0 :(得分: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
}

修改

如果您希望将用户重定向到格式为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]

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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;
  });
});