有没有好的“Laravel方法”?在返回json结果时转义HTML


Is there a good "Laravel way" to escape html when returning json results?

我觉得这应该是一个常见的问题,但我还没能找到一个答案。Blade模板可以很容易地用{{ $variable }}转义html,但对于将json输出到ajax请求,就不那么容易了。

当然,我使用一个应用程序,它对用户输入的数据进行了大量的ajax调用,并将结果作为JSON返回给客户端,客户端将其呈现在jQuery DataTable中。所以考虑这个场景:

$contacts = Contact::whereUserId(Auth::id())
                ->select('id', 'first_name', 'last_name', 'email', 'age')
                ->get();
return response()->json($contacts);

我想要转义这些名称字段,以便在数据表中呈现它们之前进行html/脚本注入,例如姓和名。我能想到的唯一方法就是循环遍历集合中的每一行,对于每个字段,循环遍历每个字段,如果它是字符串,则使用e()

在Laravel框架中有什么东西来处理这个过程吗?还是一个好的包装?我宁愿不这样做每次toJson()运行,因为可能有时间我不想运行,或者喜欢如果它是一个API调用,我需要返回原始json数据。

任何建议吗?我目前使用的是Laravel 5.2。

对于记录,只有少数字段意味着包含html。

更新:正如在评论中指出的,我正在使用数据表。目前,我使用render选项,这只是一个闭包,在我想要转义的每一列上使用基于javascript的条带标记/html实体函数。我有点觉得我做错了,应该有一些功能在Laravel框架中自动做到这一点,因为它是多么常见,加上刀片模板的设置方式,但这被认为是一个理想的解决方案吗?

jQuery数据表不转义HTML,所以如果字段包含<b>Text</b>,它将默认以粗体显示在表中。

您可以使用以下代码在响应中编码HTML实体:

return response()->json(array_map('e', $contacts->toArray()));

如果你正在使用Yajra数据表的Laravel,它有escapeColumns()方法,你可以用它来转义HTML实体在一些或所有列。例如:

return Datatables::of($contacts)
   ->escapeColumns(['first_name', 'last_name')
   ->make(true);