Laravel 5全球数据访问器

Mik*_*der 7 php laravel eloquent laravel-5

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

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

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');
}
Run Code Online (Sandbox Code Playgroud)

这样日期将被强制显示为d-m-Y H:i:s.唯一的问题是:我不想为我创建的每个模型执行此操作..

是否有一个默认的Laravel方式/约定我可以在全球范围内执行此操作,或者我应该制作某种类型MasterModel并扩展它而不是Model

Kob*_*oby 10

我一直在寻找相同的,但遗憾的是无法想出一种创建全局访问器的方法.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class User extends Authenticatable
{
    use FormatsDates;
}
Run Code Online (Sandbox Code Playgroud)

也许有人觉得这很有用.


jed*_*ylo 6

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

class User extends Model {
  protected $dateFormat = 'U'; // this will give you a timestamp
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关可用格式的更多信息:http://php.net/manual/en/function.date.php

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

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

class User extends BaseModel {
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是OOP的美丽 (3认同)
  • 为什么是这个漂亮的 OOP?仅共享属性的继承是一种不好的做法。 (2认同)
  • 仅仅为此创建一个父类是不好的。改用特征。 (2认同)