我觉得这应该是一个常见的问题,但我还没能找到一个答案。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);