Laravel 5全球数据访问器

时间:2015-07-26 09:22:32

标签: php laravel laravel-5 eloquent

我看了几个Laracast课程,现在我正在建立我的第一个Laravel项目。我有一些带有时间戳的Eloquent模型,用于created_at和updated_at。

为了显示正确的日期格式,Laravel有一个非常好的功能:访问者。但在每个Eloquent模型中,我现在有两个这样的函数:

public function getUpdatedAtAttribute($value) {
    return Carbon::parse($value)->format('d-m-Y H:i:s');
}
public function getCreatedAtAttribute($value) {
    return Carbon::parse($value)->format('d-m-Y H:i:s');
}

这样,日期将被强制显示为d-m-Y H:i:s。唯一的问题是:我不想为我创建的每个模型都这样做。

是否有默认的Laravel方式/约定我可以在全球范围内执行此操作,还是应该制作某种MasterModel并将其扩展而不是Model

2 个答案:

答案 0 :(得分:8)

我一直在寻找相同的东西,但遗憾的是无法想出一种创建全球访问者的方法。

dateFormat属性的“问题”是它是一个mutator,而不是一个访问器。扩展基类对于User模型和其他模型都不起作用,因为它扩展了Authenticatable,而不是直接扩展Model。

这是我做的第二件好事 - 我创造了FormatsDates特质。用你的方法:

trait FormatsDates
{
    protected $newDateFormat = 'd-m-Y H:i:s';

    public function getUpdatedAtAttribute($value) {
       return Carbon::parse($value)->format($this->newDateFormat);
    }

    public function getCreatedAtAttribute($value) {
        return Carbon::parse($value)->format($this->newDateFormat);
    }
}

现在我可以在任何我想要的模型上使用这个特性。例如用户模型:

class User extends Authenticatable
{
    use FormatsDates;
}

也许有人觉得这很有用。

答案 1 :(得分:5)

首先,您无需提供访问者来更改日期格式。在模型中设置$ dateFormat 变量就足够了,例如:

class User extends Model {
  protected $dateFormat = 'U'; // this will give you a timestamp
}

您可以在此处详细了解可用格式:http://php.net/manual/en/function.date.php

其次,如果您不想为所有模型设置 $ dateFormat 变量,请将其设置在那里并使所有模型扩展该类:

class BaseModel extends Illuminate\Database\Eloquent\Model {
  protected $dateFormat = 'U';
}

class User extends BaseModel {
  ...
}