这是我的路线:
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
如果我手动操作后者,它可以正常工作。我错过了什么?
答案 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;
});
});