我要在路由未直接调用的函数中发送json响应,因此我添加了send()
函数,如下所示:
return response()->json([
'key' => 'value'
], 400)->send();
这会在浏览器中导致以下响应:
{"key":"value"}{}
这些空的花括号从哪里来?我如何摆脱它们,因为这会导致前端无法识别真正的响应。
出于这个问题,简化的代码如下所示:
routes.php
Route::post('/validate', 'ValidationController@validate');
ValidationController.php
public function validate(Request $request)
{
// Does some validation
$this->saveData($request);
}
private function saveData(Request $request)
{
// saves the data
try {
// Tries something
} catch (\Throwable $exception) {
return response()->json([
'key' => 'value'
], 400)->send();
}
// saves the data
}
答案 0 :(得分:2)
send()
不一定会阻止代码进一步运行。它只是将响应写入OB。 Controller中没有任何东西可以阻止进一步执行(就像return
那样)。实际上,它仅在FastCGI env中这样做,因为它在内部调用fastcgi_finish_request
。
如果您使用Apache,那么您的问题很容易重现:
response(['test' => 'testdata'])->send();
return response()->json(null);
// --> {"test":"testdata"}{}
幸运的是,还有throwResponse()
助手。如果您使用它而不是send()
,它将把响应作为{{1 }},从而阻止进一步的代码执行(->可能将其他响应写入OB /输出)。
更多见解:
我只是在您的控制器中猜到了您最后写了HttpResponseException
的位置,您有某种// saves the data
返回了一个return
值。
天真的解决方案是:
null
之后exit
-真的很丑send()
对控制器的响应,检查方法return
之类的返回值,然后进一步返回 instanceof Response
确实很有帮助/便利,而不是此类解决方案。
答案 1 :(得分:0)
return response([
'key' => 'value'
], 400)->send();
将对象和数组自动变形为json。您只需要这样做:
{{1}}
请参阅:https://github.com/laravel/framework/blob/5.2/src/Illuminate/Http/Response.php#L43