Laravel получить атрибут модели: разница между двумя методами

Я обнаружил, что есть два способа получить / отобразить атрибут модели с помощью Laravel. Я мог бы создать функцию в User.php например:

public function getUsername() {
return $this->username;
}

Затем отобразите имя пользователя следующим образом:

{{{ Auth::user()->getUsername() }}}

Или я мог бы просто сделать это без необходимости создавать функцию:

{{{ Auth::user()->username }}}

В чем разница между этими двумя методами?

5

Решение

Нет никакой разницы. В этом случае вы получите точно такой же результат, поэтому эта функция не будет слишком полезна в этом случае. В вышеприведенном случае вы просто создали функцию, которая возвращает одно из полей, но вы также можете создать функцию, которая возвращает 2 поля, разделенных запятой:

public function getUserAge() {
return $this->username.', '.$this->age;
}

и тогда вы могли бы использовать

{{{ Auth::user()->getUserAge() }}}

по вашему мнению.

Но вы также можете создать аксессор и мутаторы для атрибутов вашей модели, чтобы изменить то, что вы устанавливаете / получаете от вашей модели

3

Другие решения

Когда используешь $someObject->username в этом случае __get() магический метод возвращает свойство из attributes массив, потому что username свойство не является публичным свойством объекта, но оно хранится (после заполнения) внутри attributes массив и когда вы звоните getUserName() Пользовательский метод, метод возвращает свойство, и косвенно происходит то же самое. Таким образом, вам не нужно использовать метод для этого.

В обоих случаях __get() Волшебный метод запускается для возврата элемента из массива атрибутов. Проверьте о Магические методы на PHP руководство.

В некоторых случаях вам может понадобиться динамический non-existing свойство, например, если у вас есть first_name а также last_name поле / свойство, и вы хотите использовать оба имени вместе как full_name свойство тогда в этом случае, Laravel обеспечивает хороший способ получить это. Все, что вам нужно сделать, это создать такой метод:

public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}

Итак, вы можете использовать {{ $user->full_name }} чтобы получить это объединенное значение.

5

В значительной степени без разницы, за исключением того, что добавление функции-обертки для получения ее только через атрибут добавит накладные расходы на дополнительный вызов функции, который вам не нужен (таким образом, незначительно уменьшая производительность).

Получение атрибута (в вашем примере, просто $this->username) в конечном итоге сводится к вызову этой функции в Illuminate\Database\Eloquent\Model:

/**
* Dynamically retrieve attributes on the model.
*
* @param  string  $key
* @return mixed
*/
public function __get($key)
{
return $this->getAttribute($key);
}

Заключение этого вызова в функцию совершенно не нужно.

3

Нет разницы, кто имущество или же поле класса, в то время как другой метод получения, который также возвращает это поле. Это просто общий пример ООП.

Поскольку это объект модели, вы можете вызывать все методы и свойства модели, если они являются открытыми и защищенными.

1