Symfony2 - 调用了错误的控制器操作
Symfony2 - Wrong controller action called
我在页面上做了很多事情,我想我在某个地方遇到了冲突。基本上,我的页面最初显示一个输入和一个空白 div。提供并提交输入后,页面会刷新 div 数据。然后用户可以 select 一些数据并最终再次提交。
这是我的看法
{% block main %}
<div class="col-md-4">
<section class="panel panel-default">
<header class="panel-heading">
<h3 class="panel-title">Terminal</h3>
</header>
<div class="panel-body">
<form action="{{ path('NickAlertBundle_terminalSearch') }}" method="post" enctype="multipart/form-data" class="terminalForm" id="terminalForm">
<div class="row">
<div class="col-md-12">
<input type="text" class="addMargin" id="terminal_command" name="terminal_command" placeholder=">">
</div>
</div>
<div class="row">
<div class="col-md-8 col-md-offset-4">
<input type="submit" class="btn btn-default" id="terminal_submit" value="Submit">
</div>
</div>
</form>
</div>
</section>
</div>
<div class="col-md-8" id="terminal-window">
<table class="terminalAvailability">
{% if data is defined %}
<form action="{{ path('NickAlertBundle_terminalCreate') }}" method="post" enctype="multipart/form-data" class="terminalForm">
{% for info in data %}
<tr>
<td class="flightNumber">{{ info.flightNumber }}</td>
<td class="details">{{ info.from ~ info.to }}</td>
{% for seat, availability in info.seats %}
<td class="seatClass">
<label for="{{ seat }}">
<span>{{ seat ~ availability }}</span>
</label>
<input type="checkbox" id="{{ seat }}" name="seats[{{ info.flightNumber }}][]" style="display: none;" value="{{ seat }}" />
</td>
{% endfor %}
<td class="otherInfo">{{ info.other }}</td>
</tr>
{% endfor %}
<div class="row">
<div class="col-md-8 col-md-offset-4">
<input type="submit" class="btn btn-default" value="Submit">
</div>
</div>
</form>
{% endif %}
</table>
</div>
<div class="modal"></div>
{% endblock %}
第一个 div 是输入,第二个 div 是 div 将显示、select 编辑并重新提交的数据。
然后我有我的控制器操作
public function terminalAction()
{
return $this->render('NickAlertBundle:Page:terminal.html.twig');
}
public function terminalSearchAction(Request $request)
{
try {
$terminal_command = strtoupper($request->get('terminal_command'));
$error = array();
if (!$terminal_command) {
$error[] = "Please enter the Command";
}
if (count($error)) {
echo "There were errors adding the alert.\n\n";
foreach ($error as $item) {
echo $item . "\n";
}
die();
}
$uapiService = $this->container->get('alert_bundle.api_service');
$commandData = $apiService->terminalService($terminal_command);
return $this->render('NickAlertBundle:Page:terminal.html.twig', array(
'data' => $commandData,
));
}catch (Exception $e) {
}
}
public function terminalCreateAction(Request $request)
{
try {
foreach ($request->request->get('seats') as $row) {
foreach ($row as $seat) {
var_dump($seat);
}
}
return $this->render('NickAlertBundle:Page:terminal.html.twig');
}catch (Exception $e) {
}
}
最后是我的路线
NickAlertBundle_terminal:
pattern: /terminal
defaults: { _controller: NickAlertBundle:Alert:terminal }
methods: [GET]
NickAlertBundle_terminalSearch:
pattern: /terminal
defaults: { _controller: NickAlertBundle:Alert:terminalSearch }
methods: [POST]
NickAlertBundle_terminalCreate:
pattern: /terminal
defaults: { _controller: NickAlertBundle:Alert:terminalCreate }
methods: [POST]
因此页面最初显示正常。然后用户输入一些内容并提交,然后响应数据显示在 div 中。所以这意味着前两条路线完美无缺。有了div里的数据,用户可以select一些数据,然后提交。但是,当提交此数据时,它们显示为
There were errors adding the alert. Please enter the Command
这个错误是针对第二个动作的,应该和第三个动作没有任何关系。第二种形式的路径设置为 NickAlertBundle_terminalCreate 那么为什么它会与其他动作交叉?
谢谢
NickAlertBundle_terminalCreate
将始终解决为 NickAlertBundle_terminalSearch
,因为 RouteMatcher 将始终将模式 /terminal
+ 方法 POST
匹配到具有这些规则的第一条路线。
为什么不给 NickAlertBundle_terminalSearch
一个类似 /terminal/search
的模式?
我在页面上做了很多事情,我想我在某个地方遇到了冲突。基本上,我的页面最初显示一个输入和一个空白 div。提供并提交输入后,页面会刷新 div 数据。然后用户可以 select 一些数据并最终再次提交。
这是我的看法
{% block main %}
<div class="col-md-4">
<section class="panel panel-default">
<header class="panel-heading">
<h3 class="panel-title">Terminal</h3>
</header>
<div class="panel-body">
<form action="{{ path('NickAlertBundle_terminalSearch') }}" method="post" enctype="multipart/form-data" class="terminalForm" id="terminalForm">
<div class="row">
<div class="col-md-12">
<input type="text" class="addMargin" id="terminal_command" name="terminal_command" placeholder=">">
</div>
</div>
<div class="row">
<div class="col-md-8 col-md-offset-4">
<input type="submit" class="btn btn-default" id="terminal_submit" value="Submit">
</div>
</div>
</form>
</div>
</section>
</div>
<div class="col-md-8" id="terminal-window">
<table class="terminalAvailability">
{% if data is defined %}
<form action="{{ path('NickAlertBundle_terminalCreate') }}" method="post" enctype="multipart/form-data" class="terminalForm">
{% for info in data %}
<tr>
<td class="flightNumber">{{ info.flightNumber }}</td>
<td class="details">{{ info.from ~ info.to }}</td>
{% for seat, availability in info.seats %}
<td class="seatClass">
<label for="{{ seat }}">
<span>{{ seat ~ availability }}</span>
</label>
<input type="checkbox" id="{{ seat }}" name="seats[{{ info.flightNumber }}][]" style="display: none;" value="{{ seat }}" />
</td>
{% endfor %}
<td class="otherInfo">{{ info.other }}</td>
</tr>
{% endfor %}
<div class="row">
<div class="col-md-8 col-md-offset-4">
<input type="submit" class="btn btn-default" value="Submit">
</div>
</div>
</form>
{% endif %}
</table>
</div>
<div class="modal"></div>
{% endblock %}
第一个 div 是输入,第二个 div 是 div 将显示、select 编辑并重新提交的数据。
然后我有我的控制器操作
public function terminalAction()
{
return $this->render('NickAlertBundle:Page:terminal.html.twig');
}
public function terminalSearchAction(Request $request)
{
try {
$terminal_command = strtoupper($request->get('terminal_command'));
$error = array();
if (!$terminal_command) {
$error[] = "Please enter the Command";
}
if (count($error)) {
echo "There were errors adding the alert.\n\n";
foreach ($error as $item) {
echo $item . "\n";
}
die();
}
$uapiService = $this->container->get('alert_bundle.api_service');
$commandData = $apiService->terminalService($terminal_command);
return $this->render('NickAlertBundle:Page:terminal.html.twig', array(
'data' => $commandData,
));
}catch (Exception $e) {
}
}
public function terminalCreateAction(Request $request)
{
try {
foreach ($request->request->get('seats') as $row) {
foreach ($row as $seat) {
var_dump($seat);
}
}
return $this->render('NickAlertBundle:Page:terminal.html.twig');
}catch (Exception $e) {
}
}
最后是我的路线
NickAlertBundle_terminal:
pattern: /terminal
defaults: { _controller: NickAlertBundle:Alert:terminal }
methods: [GET]
NickAlertBundle_terminalSearch:
pattern: /terminal
defaults: { _controller: NickAlertBundle:Alert:terminalSearch }
methods: [POST]
NickAlertBundle_terminalCreate:
pattern: /terminal
defaults: { _controller: NickAlertBundle:Alert:terminalCreate }
methods: [POST]
因此页面最初显示正常。然后用户输入一些内容并提交,然后响应数据显示在 div 中。所以这意味着前两条路线完美无缺。有了div里的数据,用户可以select一些数据,然后提交。但是,当提交此数据时,它们显示为
There were errors adding the alert. Please enter the Command
这个错误是针对第二个动作的,应该和第三个动作没有任何关系。第二种形式的路径设置为 NickAlertBundle_terminalCreate 那么为什么它会与其他动作交叉?
谢谢
NickAlertBundle_terminalCreate
将始终解决为 NickAlertBundle_terminalSearch
,因为 RouteMatcher 将始终将模式 /terminal
+ 方法 POST
匹配到具有这些规则的第一条路线。
为什么不给 NickAlertBundle_terminalSearch
一个类似 /terminal/search
的模式?