在 Laravel 5 中,全局 Mutator 用于在模型属性被设置时自动转换数据。要创建一个全局 Mutator 以转义所有 HTML 字符,你可以按照以下步骤操作:
$casts
的属性,将该属性设置为一个数组,键名为你想要转换的属性,键值为你希望使用的转换类型。array_map
函数和 htmlspecialchars
函数来创建一个全局转换函数,该函数将在每次属性值被设置时调用。下面是一个如何在所有属性上转义 HTML 字符的示例:
class User extends Model
{
protected $casts = [
'*'
];
public function setAttribute($key, $value)
{
$value = $this->escapeHtml($value);
return parent::setAttribute($key, $value);
}
protected function escapeHtml($value)
{
if (is_string($value)) {
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
if (is_array($value)) {
return array_map([$this, 'escapeHtml'], $value);
}
if (is_object($value) && method_exists($value, '__toString')) {
return $this->escapeHtml((string)$value);
}
return $value;
}
}
在这个示例中,我们首先在模型的 $casts
属性中使用了通配符 *
,以便为所有属性应用转换。然后,我们覆盖了 setAttribute
方法,以便在设置属性值时调用 escapeHtml
方法。escapeHtml
方法会检查给定值的类型,并相应地应用 htmlspecialchars
函数。对于数组和对象,我们递归地调用 escapeHtml
方法以确保所有嵌套的值也会被转义。
这样,当你设置模型属性时,所有 HTML 字符都将被自动转义。这对于防止跨站脚本攻击(XSS)非常有用。
领取专属 10元无门槛券
手把手带您无忧上云