如何正确使用Laravel的“基础模型”来扩展getAttribute()?

时间:2015-01-21 10:06:00

标签: laravel laravel-4

我试图在返回字段时找到一个添加一些全局行为的地方,而不是为所有模型中的所有字段定义访问器。

这促使我尝试创建一个扩展BaseModel的{​​{1}}类。我的印象是,在查询模型时应该为每个字段调用。但是,似乎只在请求特定字段时调用它。

有人可以帮我理解getAttribute()以及为什么在下面的第一个例子中没有调用它?也许有一个更好的地方来定义某种"全球访问者"行为以及我不知道的行为。谢谢!

样本模型:

getAttribute()

BaseModel:

class Thingy extends BaseModel {

}

结果:

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

    parent::getAttribute($key);
  }   
}

1 个答案:

答案 0 :(得分:1)

访问属性时将调用

getAttribute()

$model->title;

当您从控制器返回模型时,它将转换为JSON。通过在模型上调用toArray()来实现这一点。这不会调用getAttribute(),但稍后会直接访问$attributes数组。


基本上对于此类型转换(tinyint为布尔值,null为空字符串),您可以使用getAttribute()toArray()两种方法。

如果您使用JSON将数据发送到客户端,则{p> toArray()如果您将模型传递到服务器端视图,则getAttributepublic function toArray(){ $array = parent::toArray(); foreach($array as $attribute){ // conversions } return $array; } public function getAttribute($key){ $attribute = parent::getAttribute($key); // conversions return $attribute; } (如果你同时使用这两种方法)

{{1}}