首先, 你是否也在laravel中写了类似这样的js呢:
$.get("{{route('admin.user.index', array_merge($data, ['__sort__Exp'=>'desc']))}}");
//or
document.URL="{{route('admin.user.index', array_merge($data, ['__sort__Exp'=>'desc']))}}";
结果报错了, 打印下传过来的参数显示: 除第一个每个参数外, 每个前面都加了个amp; 为什么会这样呢?
于是, 我又在js console.log下, 看看前端传的url到底是什么样的:
console.log("{{route('admin.user.index', array_merge($data, ['__sort__Exp'=>'desc']))}}")
console.log结果如下: 可以看到前端传之前, 参数前就已经存在amp;了
这么看来是请求之前默认给处理了, 这里我先故意打印一个错误语法, 比如数组当字符:
console.log("{{array_merge($data, ['__sort__Exp'=>'desc'])}}");
报错显示为:
我可没用这个函数啊, 怎么回事呢, 这次看下laravel缓存的页面, 在storage/framework/views下, 看看原生php到底是什么:
console.log("<?php echo e(array_merge($data, ['__sort__Exp'=>'desc'])); ?>");
注意这里有个e函数,想必就是它进行转义了, 再来看下这个e函数张什么样:
/**
* Escape HTML entities in a string.
*
* @param \Illuminate\Contracts\Support\Htmlable|string $value
* @return string
*/
function e($value)
{
if ($value instanceof Htmlable) {
return $value->toHtml();
}
return htmlentities($value, ENT_QUOTES, 'UTF-8', false);
}
这下总算真相了, laravel中的{{}}双花括号最终会用htmlentities函数.
最后解决办法, 就是不用{{}}双花括号, 我们可以这样写来避免url转义:
console.log("{!! route('admin.user.index', array_merge($data, ['__sort__Exp'=>'desc'])) !!}");
//or
console.log("<?php echo route('admin.user.index', array_merge($data, ['__sort__Exp'=>'desc']));?>");
题外: 话说我标题中的&怎么变成&了, 又被转义了, ?, 有空再看看吧