给Laravel模型添加setter和getter


Adding Setters and Getters to Laravel Model

如果我想要一个Eloquent Model类有setter和getter来实现一个接口,下面的方法有意义吗?还是有一个'laravel'的方法来解决这个问题?

class MyClass extends Model implements someContract
{
  public function setFoo($value) {
      parent::__set('foo', $value);
      return $this;
  }
  public function getFoo() {
      return parent::__get('foo');
  }
}

您可能正在寻找访问器(getter)和mutator (setter)。

Laravel中访问器(getter)的例子:

public function getFirstNameAttribute($value)
{
    return ucfirst($value);
}

Laravel中mutator (setter)的例子:

public function setFirstNameAttribute($value)
{
    $this->attributes['first_name'] = strtolower($value);
}

对于新的laravel,你可以在model:

/**
* Interact with the user's first name.
*
* @param  string  $value
* @return 'Illuminate'Database'Eloquent'Casts'Attribute
*/
protected function firstName(): Attribute
{
    return Attribute::make(
       get: fn ($value) => ucfirst($value),
       set: fn ($value) => strtolower($value),
    );
}

想知道更多吗?参见:(相同的实现)

  • https://laravel.com/docs/9.x/eloquent-mutators defining-a-mutator
  • https://laravel.com/docs/10.x/eloquent-mutators defining-a-mutator