2017-01-13 104 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陣列。