2015-01-21 2 views
0

Я пытаюсь найти место, чтобы добавить какое-то глобальное поведение при возврате полей, а не определять аксессоры для всех полей во всех моделях.Как правильно использовать «базовую модель» с Laravel для расширения getAttribute()?

Это привело меня к созданию класса BaseModel, который распространяется на getAttribute(). Я был под впечатлением, что это нужно вызывать для каждого поля при запросе модели. Однако кажется, что он вызывается только при запросе определенного поля.

Может кто-нибудь помочь мне разобраться в getAttribute() и почему его не вызывают в первом примере ниже? Возможно, есть лучшее место для определения какого-то «глобального аксессуарного» поведения, которое я не знаю. Благодаря!

Пример модели:

class Thingy extends BaseModel { 

} 

BaseModel:

class BaseModel extends Eloquent { 
    public function getAttribute($key) { 
    Log::alert($key); 

    parent::getAttribute($key); 
    } 
} 

Результаты:

return Thingy::find(1); // Returns all fields, but does not hit getAttribute() 

return Thingy::find(1)->title // Returns and logs only title 

ответ

1

getAttribute() будет вызываться при доступе к собственности:

$model->title; 

Когда вы просто вернете модель с вашего контроллера, она будет преобразована в JSON. Это происходит путем вызова toArray() на модели. И это просто не вызовет getAttribute(), но позже будет напрямую обращаться к массиву $attributes.


По существу для преобразования таких типов (TINYINT в логическое значение, NULL пустая строка), вы можете использовать оба метода getAttribute() или toArray().

toArray() Если вы используете JSON для отправки данных клиенту и getAttribute, если вы передаете модель на вид сбоку на сервере. (Если вы сделаете так, то вам нужно оба метода)

public function toArray(){ 
    $array = parent::toArray(); 
    foreach($array as $attribute){ 
     // conversions 
    } 
    return $array; 
} 

public function getAttribute($key){ 
    $attribute = parent::getAttribute($key); 
    // conversions 
    return $attribute; 
} 
+0

Если вам нужна дополнительная помощь, скажите мне, что вы хотите достичь, и я буду править мой ответ;) – lukasgeiter

+0

Спасибо за разъяснение. Я по существу пытаюсь добавить какое-то глобальное поведение, чтобы делать такие вещи, как: - Преобразование любых полей, которые являются Tinyint 0 или 1, истинными/ложными при возврате в пользовательский интерфейс или преобразование любых значений NULL в пустую строку – Runcible

+0

Хорошо. Обновлен ответ ... – lukasgeiter

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