2015-11-28 2 views
2

Аксессоры отлично выполняют свою работу по одному атрибуту, но мне нужен способ иметь метод для работы с Accessor/Getter по всем атрибутам и автоматически.Измените все атрибуты модели Laravel

Целью является то, что я хочу заменить некоторые символы/цифры на получение атрибутов, а затем распечатать их. Я могу сделать это изнутри контроллера и вручную, но я думаю, было бы здорово иметь его со стороны модели и автоматически.

Как переопределение getAttributes() метод:

public function getAttributes() 
{ 
    foreach ($this->attributes as $key => $value) { 
     $this->attributes[$key] = str_replace([...], [...], $value); 
    } 
    return $this->attributes; 
} 

Но я должен назвать это каждый раз, когда на модели $model->getAttributes();

Любой способ сделать это автоматически и DRY?

+0

Как насчет переопределение конструктора и использовать родительский :: __ конструкт()? Или добавьте конструкцию использования модели расширения класса, и пусть модели расширяют этот новый класс, поэтому он применяется ко всем. –

+0

@TimvanUum На самом деле я сделал это, но я думаю, что должно быть что-то не так, поскольку это вообще не повлияло на результаты! – revo

+0

Странный просто попробовал сам, и действительно, он не работает. Даже при вызове метода заполнения снова. –

ответ

5

Try что-то вроде:

public function getAttribute($key) 
{ 
    if (array_key_exists($key, $this->attributes) || $this->hasGetMutator($key)) { 
     if($key === 'name') return 'modify this value'; 
     return $this->getAttributeValue($key); 
    } 

    return $this->getRelationValue($key); 
} 

Это полностью перекрывая метод по умолчанию, так быть осторожным.

EDIT

Также проверьте: http://laravel.com/docs/5.1/eloquent-mutators

+0

Отличное решение для переопределения 'getAttribute'. Однако при установке значения вызываются мутаторы, что не является целью здесь. – Bogdan

+0

Не могли бы вы пояснить свой комментарий немного дальше. Или, может быть, уточните, почему это решение не работает? –

+0

@shock_gone_wild Не могли бы вы объяснить, почему решение не работает? Вы получили сообщение об ошибке? Вы не получаете желаемых результатов? Эта функция может быть добавлена ​​к определенному классу модели (например, пользователю) или создать новый класс (CustomBaseModel), который расширяет модель и добавляет ее туда, а модель расширяет этот новый класс. Измените if ($ key === 'name') на то, что вы хотите изменить или удалить, чтобы изменить все. Использовать: $ this-> getAttributeValue ($ key); для изменения значения –

0

Как о запуске его с каждым Создание и обновление событий. Таким образом, вы можете сделать что-то подобное:

public function boot() 
    { 
     Model::creating(function ($model) 
      return $model->getAttributes(); //or $this->getAttributes() 
     }); 
     Model::updating(function ($model) 
      return $model->getAttributes(); //or $this->getAttributes() 
     }); 
    } 
+0

Создает ли 'model :: creation()' при создании экземпляра модели? – revo

+0

Перед сохранением, вы можете использовать save() для замены как обновления, так и создания –

+0

Вы ошибаетесь. Я не собираюсь делать это при сохранении, а при получении. Я говорил об аксессуарах, а не о мутаторах. – revo

1

Я хотел бы пойти со следующим подходом и переопределить модели __get метод:

public function __get($key) 
{ 
    $excluded = [ 
     // here you should add primary or foreign keys and other values, 
     // that should not be touched. 
     // $alternatively define an $included array to whitelist values 
     'foreignkey', 
    ]; 

    // if mutator is defined for an attribute it has precedence. 
    if(array_key_exists($key, $this->attributes) 
     && ! $this->hasGetMutator($key) && ! in_array($key, $excluded)) { 
     return "modified string"; 
    } 

    // let everything else handle the Model class itself 
    return parent::__get($key); 
} 

}

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