Laravel得到模型属性:两种方法的区别


Laravel get model attribute: difference between two methods

我发现有两种方法可以使用Laravel获取/显示模型的属性。我可以在User.php中创建一个函数,例如:

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

然后显示如下用户名:

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

或者我可以简单地这样做,而不需要创建一个函数:

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

这两种方法有什么区别?

在这种情况下使用$someObject->username时,__get()魔术方法从attributes数组返回属性,因为username属性不是对象的公共属性,但它存储在attributes数组内(填充后),当您调用getUserName()自定义方法时,该方法将返回该属性,并且间接地发生相同的事情。因此,您不需要为此使用方法。

在这两种情况下,都会触发__get()魔术方法来返回属性数组中的项。查看PHP手册中的魔术方法。

在某些情况下,您可能需要使用动态non-existing属性,例如,如果您有一个first_namelast_name字段/属性,并且您想将这两个名称一起用作full_name属性,那么在这种情况下,Laravel提供了一种很好的方法来获取它

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

因此,您可以使用{{ $user->full_name }}来获得连接的值。

没有区别。在这种情况下会得到完全相同的结果,所以这个函数在这种情况中不会有太大帮助。在上面的例子中,您只需创建返回一个字段的函数,但也可以创建返回两个逗号分隔的字段的函数:

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

然后你可以使用

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

在您看来。

但是,您也可以为模型属性创建访问器和赋值器,以更改您从模型中设置/获得的内容

几乎没有什么区别,只是添加一个包装函数来通过属性来获取它会增加额外的函数调用的开销,而您不需要这样做(从而略微降低性能)。

获取一个属性(在您的示例中只执行$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);
}

用自己的函数调用封装这个函数调用是完全没有必要的。

没有区别,一个是类的属性字段,而另一个是getter方法,它也返回该字段。这只是OOP的常见例子。

由于它是一个模型对象,所以如果所有模型方法和属性都是公共的和受保护的,则可以调用它们。