Laravel调用内部函数后Ajax无响应问题及解决方法
Laravel Ajax请求调用含echo的方法后无响应的解决方案
我之前也碰到过完全一样的坑!咱们一步步来理清楚问题所在,以及怎么解决:
问题场景还原
首先看你的前端Ajax请求代码,逻辑是没问题的:
$(".btn-submit").click(function(e){ e.preventDefault(); var name = $("input[name=name]").val(); var password = $("input[name=password]").val(); var email = $("input[name=email]").val(); $.ajax({ type:'POST', url:"{{ route('ajaxRequest.post') }}", data:{name:name, password:password, email:email}, success:function(data){ alert(data.success); } }); });
控制器直接返回JSON时一切正常:
public function post() { return response()->json(['success'=>'Got Simple Ajax Request.']); }
但一旦在控制器里调用带echo的hello()方法,Ajax就拿不到响应了:
public function post() { self::hello(); return response()->json(['success'=>'Got Simple Ajax Request.']); }
问题根源
问题就出在hello()里的echo语句!
Laravel的response()->json()会生成标准的JSON格式响应,要求响应体是纯JSON字符串。但echo会直接把内容输出到HTTP响应流里,比JSON响应先一步发送给前端。比如如果hello()里有echo "Hello World";,那前端实际收到的响应内容是:
Hello World{"success":"Got Simple Ajax Request."}
这根本不是合法的JSON格式,Ajax的success回调自然无法解析这个错误的响应,也就不会触发预期的逻辑。
修复方案
方案1:替换echo为日志(推荐)
如果echo是用来调试的,换成Laravel的日志系统,这样既不影响响应格式,又能查看调试信息:
// 先引入门面 use Illuminate\Support\Facades\Log; public function hello() { // 把echo换成日志 Log::info('这里是原本echo的内容'); // 其他逻辑... }
方案2:临时用输出缓冲清空echo内容(不推荐)
如果暂时没法移除echo,可以用PHP的输出缓冲控制来拦截echo的内容,避免它混入响应:
public function post() { ob_start(); // 开启输出缓冲,拦截所有输出 self::hello(); // 执行带echo的方法 ob_end_clean(); // 清空缓冲,不输出拦截到的内容 return response()->json(['success'=>'Got Simple Ajax Request.']); }
不过这个只是临时 workaround,长期来看还是要避免在处理Ajax请求的流程里使用echo。
内容的提问来源于stack exchange,提问作者Mohammad Farfour
相关产品推荐
相关产品推荐

