2017-01-13 5 views
0

Erstellen einer API, aber weil ich dynamisch Tabellen usw. in Vue.js aus der API-Antwort zu erstellen, kann ich nicht verwenden Blades html-Escaping.Laravel 5 Global Mutator, um alle HTML-Zeichen zu entkommen?

Ich weiß, dass mein Modell in ich einen Mutator verwenden:

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

Aber wir haben eine Menge Felder, die sich über viele Modelle bearbeitet werden können. Gibt es eine Möglichkeit, alle Werte automatisch mit htmlspecialchars() zurückzugeben?

Oder ist die einzige Option, die API-Antworten zu ändern, um htmlspecialchars() für jedes Feld auszuführen?

Danke.

EDIT: Verwenden von Laravel Spark. Vorgeschlagene Antwort war, ein neues Modell zu erstellen und dieses auf unseren Modellen zu erweitern, aber die Spark-Modelle haben bereits eine lange Liste von erweiterten Klassen.

Antwort

0

Sie können eine Klasse erstellen, die Model Klasse erweitert und alle Sie Modelle diese Klasse anstelle von Model erweitern. In der Klassenüberschreibung getAttributeValue Methode:

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

Das war mein anfängliches Denken. Ich werde zurückgehen und die Frage bearbeiten, aber ich benutze tatsächlich Laravel Spark. Unsere benutzerdefinierten Modelle sind in Ordnung, aber das Spark-Benutzermodell zum Beispiel erweitert SparkUser, der dann Authenticatable und so weiter erweitert. – Lovelock

0

Neben erweitern Klassen. Alternative Lösung ist die Verwendung von Merkmalen.

Erstellen Sie ein neues Merkmal

namespace App\Traits; 

trait ExtendedModel { 

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

Verwenden Züge in erforderlich Modelle:

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use App\Traits\ExtendedModel; 

class MyTable extends Model 
{ 
    use ExtendedModel; 
} 
0

Dies ist, wie ich dies tun würde.

Ich würde ein Merkmal machen und dann dieses Merkmal an alle Modelle anhängen, wo Sie es wollen. Die Eigenschaft würde getAttributeValue($key) Methode mit Ihrer eigenen Logik überschreiben. Gefällt mir:

trait CastAttributes { 

    public function getAttributeValue($value) 
    { 
     $value = $this->getAttributeValue($value); 
     return is_string($value) ? strtolower($this->getAttributeValue($value)) : $val; 
    } 
} 

Dieses Being sagte, Sie werden wahrscheinlich nicht unbedingt alles werfen wollen. In diesem Fall würde ich dies tun:

trait CastAttributes { 

    protected $toLower = []; 

    public function getAttributeValue($key) 
    { 
     $value = $this->getAttributeValue($key); 
     return in_array($key, $this->toLower) ? strtolower($value) : $value; 
    } 
} 

Und dann überschreiben die $toLower Array mit allen Attributen, die Sie tatsächlich in Kleinbuchstaben gegossen werden soll.

Verwandte Themen