Я обнаружил, что есть два способа получить / отобразить атрибут модели с помощью Laravel. Я мог бы создать функцию в User.php
например:
public function getUsername() {
return $this->username;
}
Затем отобразите имя пользователя следующим образом:
{{{ Auth::user()->getUsername() }}}
Или я мог бы просто сделать это без необходимости создавать функцию:
{{{ Auth::user()->username }}}
В чем разница между этими двумя методами?
Нет никакой разницы. В этом случае вы получите точно такой же результат, поэтому эта функция не будет слишком полезна в этом случае. В вышеприведенном случае вы просто создали функцию, которая возвращает одно из полей, но вы также можете создать функцию, которая возвращает 2 поля, разделенных запятой:
public function getUserAge() {
return $this->username.', '.$this->age;
}
и тогда вы могли бы использовать
{{{ Auth::user()->getUserAge() }}}
по вашему мнению.
Но вы также можете создать аксессор и мутаторы для атрибутов вашей модели, чтобы изменить то, что вы устанавливаете / получаете от вашей модели
Когда используешь $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 }}
чтобы получить это объединенное значение.
В значительной степени без разницы, за исключением того, что добавление функции-обертки для получения ее только через атрибут добавит накладные расходы на дополнительный вызов функции, который вам не нужен (таким образом, незначительно уменьшая производительность).
Получение атрибута (в вашем примере, просто $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);
}
Заключение этого вызова в функцию совершенно не нужно.
Нет разницы, кто имущество или же поле класса, в то время как другой метод получения, который также возвращает это поле. Это просто общий пример ООП.
Поскольку это объект модели, вы можете вызывать все методы и свойства модели, если они являются открытыми и защищенными.