2017-01-13 65 views
0

建立一个API,但因为我从API响应动态地在Vue.js中创建表等,所以我无法使用blade html转义。Laravel 5 Global Mutator转义所有html字符?

我知道在我的模型,我可以使用赋值函数:

public function getNameAttribute($value) { 
    return strtolower($value); // example 
} 

但我们可以在很多车型中编辑的很多领域。有没有办法我可以自动返回所有值与htmlspecialchars()?

或者是更改API响应以在每个字段上运行htmlspecialchars()的唯一选项?

谢谢。

编辑:使用Laravel火花。建议的答案是创建一个新模型并将其扩展到我们的模型上,但Spark模型已经有一长串扩展类。

回答

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; 
} 
+0

那是我最初的想法。我会回去编辑问题,但我实际上是在使用Laravel Spark。我们的自定义模型可以做到这一点,但Spark用户模型例如扩展了SparkUser,然后扩展了Authenticatable等等。 – Lovelock

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; 
} 
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阵列。