2017-01-13 2 views
0

Построение API, но поскольку я динамически создаю таблицы и т. Д. В Vue.js из ответа API, я не могу использовать удаление html-блейдов.Laravel 5 Глобальный мутатор, чтобы избежать всех html-символов?

Я знаю, что в моей модели я могу использовать мутатор:

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

Но у нас есть много полей, которые могут быть отредактированы во многих моделях. Есть ли способ, которым я могу автоматически возвращать все значения с помощью htmlspecialchars()?

Или это единственный вариант, чтобы изменить ответы API для запуска htmlspecialchars() для каждого поля?

Спасибо.

EDIT: Использование Laravel Spark. Предлагаемый ответ состоял в том, чтобы создать новую модель и расширить ее на наших моделях, но модели 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 User, например, расширяет 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; 
    } 
} 

Этот признак, скорее всего, не захочет бросить абсолютно все. В таком случае я хотел бы сделать это:

trait CastAttributes { 

    protected $toLower = []; 

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

И затем переопределить $toLower массив со всеми атрибутами, которые вы на самом деле хотите бросить в нижний регистр.

Смежные вопросы