构建API但因为我在API响应中动态创建Vue.js中的表等,所以无法使用刀片html转义。
我知道在我的模型中我可以使用mutator:
public function getNameAttribute($value) {
return strtolower($value); // example
}
但我们有很多字段可以在很多模型中编辑。有没有办法可以使用htmlspecialchars()自动返回所有值?
或者是唯一可以更改API响应以在每个字段上运行htmlspecialchars()的选项吗?
感谢。
编辑:使用Laravel Spark。建议的答案是创建一个新模型并在我们的模型上扩展它,但Spark模型已经有一长串扩展类。
答案 0 :(得分:0)
您可以创建一个扩展Model
类的类,并使所有模型扩展此类而不是Model
。在类覆盖getAttributeValue
方法中:
protected function getAttributeValue($key)
{
$value = $this->getAttributeFromArray($key);
if ($this->hasGetMutator($key)) {
return $this->mutateAttribute($key, $value);
}
if ($this->hasCast($key)) {
return $this->castAttribute($key, $value);
}
if (in_array($key, $this->getDates()) && ! is_null($value)) {
return $this->asDateTime($value);
}
return is_string($value) ? htmlspecialchars($value) : $value;
}
答案 1 :(得分:0)
除了扩展课程。替代解决方案是使用特征。
创建新特征
namespace App\Traits;
trait ExtendedModel {
public function getNameAttribute($value)
{
return strtolower($value); // example
}
}
在所需模型中使用特征:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Traits\ExtendedModel;
class MyTable extends Model
{
use ExtendedModel;
}
答案 2 :(得分:0)
我就是这样做的。
我会制作一个特性,然后将这个特性附加到你想要的所有模型上。
该特征会使用您自己的逻辑覆盖getAttributeValue($key)
方法。像这样:
trait CastAttributes {
public function getAttributeValue($value)
{
$value = $this->getAttributeValue($value);
return is_string($value) ? strtolower($this->getAttributeValue($value)) : $val;
}
}
那个beign说,你很可能不想完全抛出一切。在那种情况下,我会这样做:
trait CastAttributes {
protected $toLower = [];
public function getAttributeValue($key)
{
$value = $this->getAttributeValue($key);
return in_array($key, $this->toLower) ? strtolower($value) : $value;
}
}
然后使用您实际想要转换为小写的所有属性覆盖$toLower
数组。