Symfony 控制器返回的变量始终未定义
Variable returned by Symfony controller always undefined
好的,所以我有一个文本字段,我可以在其中键入一个字符串,旁边有一个按钮。
<div class="sidebar-search">
<div class="input-group custom-search-form">
<<label for="riot-summoner-input">Search a Summoner</label><br>
<input type="text" id="riot-summoner-input" class="form-control" placeholder="Type summoner name..." style="margin-bottom: 20px">
<button type="button" id="valid-summoner">Search</button>
</div>
</div>
通过单击此按钮,将执行以下脚本
let res = {{ summoner.summonerLevel }}
$(document).ready(function() {
// Get value on button click and pass it back to controller
$("#valid-summoner").click(function () {
const summoner_input = $("#riot-summoner-input").val();
console.log(summoner_input)
let url = `/coach/?summonerName=${summoner_input}`
history.replaceState(summoner_input, 'Coach Index', url);
console.log(url)
function loadXMLDoc()
{
document.getElementById("display-summonerLevel").innerHTML = `Summoner Level: <h2>${res}</h2>`
}
loadXMLDoc();
});
});
据我所知,这将更改我的页面 url 以包含文本字段中插入的值,并将它发送回我的控制器而不刷新页面,它确实如此。
现在在我的控制器中,我正在使用该值对其进行一些逻辑处理
/**
* @Route("/", name="app_coach_index", methods={"GET"})
*/
public function index(CoachRepository $coachRepository, riotApi $callRiot, Request $request): ?Response
{
$value = $request->request->get('summoner_input');
if($value != null){
$this->debug_to_console($value . "Hi");
return $this->render('coach/index.html.twig', [
'coaches' => $coachRepository->findAll(), 'summoner'=> $this->showSummoner("$value")
]);}
else{
$this->debug_to_console($value);
return $this->render('coach/index.html.twig', [
'coaches' => $coachRepository->findAll()
]);
}
}
现在有趣的是,我在索引函数中执行此操作。
这是我在索引函数中调用的函数,它实际上是从脚本中获取值的函数
/**
* @Route("/?summonerName={summoner_input}", name="show_summoner", methods={"GET"})
*/
public function showSummoner($summoner_input)
{
$call = new ApiClient(ApiClient::REGION_EUW, 'API-KEY-HERE');
return $call->getSummonerApi()->getSummonerBySummonerName($summoner_input)->getResult();
}
现在我看到了这个,我可以看出问题是我在 showSummoner()
函数中获取值,但试图在索引函数中使用它。这就是为什么当我将它打印到控制台并且变量未定义时我没有得到值。
老实说,我想不出任何逻辑可以解决这个问题。
EDIT!!!!!!!
好的,所以我知道问题出在哪里,问题是当我在索引函数中调用 showSummoner($value) 时。我正在使用 $value = $request->query->get('summoner_input');
我以为我是在 index 函数中获取该值,而实际上我是在 showSummoner() 函数中获取它。你可以通过注释来判断
对于索引,我在其 url 中没有参数,而在 showSummoner() 中,我在注释中有一个参数。
/**
* @Route("/?summonerName={summoner_input}", name="show_summoner", methods={"GET"})
*/
这确实是事实,因为我在脚本中使用了 url
let url = `/coach/?summonerName=${summoner_input}`
原因是我不能在索引中使用参数 url 因为那样我就必须在我使用索引的所有其他地方提供参数,即使我不这样做也是如此。没有参数意味着我没有搜索任何东西。
我希望这能给出更多说明
您正在尝试从 $_GET
全局获取值,而不是 $_POST
。
您可以替换:
$value = $request->request->get('summoner_input');
作者:
$value = $request->query->get('summoner_input');
您正在尝试使用错误的名称 ('summoner_input'
) 访问 GET 参数。
$value = $request->request->get('summoner_input');
当您在此处将其设置为 summonerName
时:
let url = `/coach/?summonerName=${summoner_input}`
您还需要传递一个默认值作为第二个参数进行检查。
试试这个:
$value = $request->request->get('summonerName', false);
if(false !== $value){
/* the parameter is in the url */
}
好的,所以我有一个文本字段,我可以在其中键入一个字符串,旁边有一个按钮。
<div class="sidebar-search">
<div class="input-group custom-search-form">
<<label for="riot-summoner-input">Search a Summoner</label><br>
<input type="text" id="riot-summoner-input" class="form-control" placeholder="Type summoner name..." style="margin-bottom: 20px">
<button type="button" id="valid-summoner">Search</button>
</div>
</div>
通过单击此按钮,将执行以下脚本
let res = {{ summoner.summonerLevel }}
$(document).ready(function() {
// Get value on button click and pass it back to controller
$("#valid-summoner").click(function () {
const summoner_input = $("#riot-summoner-input").val();
console.log(summoner_input)
let url = `/coach/?summonerName=${summoner_input}`
history.replaceState(summoner_input, 'Coach Index', url);
console.log(url)
function loadXMLDoc()
{
document.getElementById("display-summonerLevel").innerHTML = `Summoner Level: <h2>${res}</h2>`
}
loadXMLDoc();
});
});
据我所知,这将更改我的页面 url 以包含文本字段中插入的值,并将它发送回我的控制器而不刷新页面,它确实如此。
现在在我的控制器中,我正在使用该值对其进行一些逻辑处理
/**
* @Route("/", name="app_coach_index", methods={"GET"})
*/
public function index(CoachRepository $coachRepository, riotApi $callRiot, Request $request): ?Response
{
$value = $request->request->get('summoner_input');
if($value != null){
$this->debug_to_console($value . "Hi");
return $this->render('coach/index.html.twig', [
'coaches' => $coachRepository->findAll(), 'summoner'=> $this->showSummoner("$value")
]);}
else{
$this->debug_to_console($value);
return $this->render('coach/index.html.twig', [
'coaches' => $coachRepository->findAll()
]);
}
}
现在有趣的是,我在索引函数中执行此操作。
这是我在索引函数中调用的函数,它实际上是从脚本中获取值的函数
/**
* @Route("/?summonerName={summoner_input}", name="show_summoner", methods={"GET"})
*/
public function showSummoner($summoner_input)
{
$call = new ApiClient(ApiClient::REGION_EUW, 'API-KEY-HERE');
return $call->getSummonerApi()->getSummonerBySummonerName($summoner_input)->getResult();
}
现在我看到了这个,我可以看出问题是我在 showSummoner()
函数中获取值,但试图在索引函数中使用它。这就是为什么当我将它打印到控制台并且变量未定义时我没有得到值。
老实说,我想不出任何逻辑可以解决这个问题。
EDIT!!!!!!!
好的,所以我知道问题出在哪里,问题是当我在索引函数中调用 showSummoner($value) 时。我正在使用 $value = $request->query->get('summoner_input');
我以为我是在 index 函数中获取该值,而实际上我是在 showSummoner() 函数中获取它。你可以通过注释来判断
对于索引,我在其 url 中没有参数,而在 showSummoner() 中,我在注释中有一个参数。
/**
* @Route("/?summonerName={summoner_input}", name="show_summoner", methods={"GET"})
*/
这确实是事实,因为我在脚本中使用了 url
let url = `/coach/?summonerName=${summoner_input}`
原因是我不能在索引中使用参数 url 因为那样我就必须在我使用索引的所有其他地方提供参数,即使我不这样做也是如此。没有参数意味着我没有搜索任何东西。 我希望这能给出更多说明
您正在尝试从 $_GET
全局获取值,而不是 $_POST
。
您可以替换:
$value = $request->request->get('summoner_input');
作者:
$value = $request->query->get('summoner_input');
您正在尝试使用错误的名称 ('summoner_input'
) 访问 GET 参数。
$value = $request->request->get('summoner_input');
当您在此处将其设置为 summonerName
时:
let url = `/coach/?summonerName=${summoner_input}`
您还需要传递一个默认值作为第二个参数进行检查。
试试这个:
$value = $request->request->get('summonerName', false);
if(false !== $value){
/* the parameter is in the url */
}