【问题标题】:Traits inside Models模型内部的特征
【发布时间】:2018-09-23 21:52:19
【问题描述】:

例如,我有一个模型类。我希望它是Timestampable。这意味着模型必须有created_atupdated_at 字段和它们的getter。

<?php

trait Timestampable {

    protected $created_at;
    protected $updated_at;

    public function getCreatedAt() {}
    public function getUpdatedAt() {}   

}

class User extends Model {

    use Timestampable;

    protected $id;
    protected $name;
}

没事吧?或者我必须将timestampable 字段移到模型中?

Authenticatable Trait (Laravel)

在 Laravel 中,他们不会将字段放置在特征中,而只会放置其中的一些。当然,当这些字段存在于使用我们特征的类中时,它会起作用。但是我们在 IDE 自动补全方面失去了一些优势,并且使我们的代码模棱两可。

【问题讨论】:

  • Eloquent 模型已经默认启用了时间戳处理。调查 HasTimestamps 特征..
  • 如果你认为“模型”是一个类,那你就错了。
  • 如前所述,这种特殊的特性已经存在。话虽如此,框架本身确实使用特征来构成模型,所以你这样做没有错。就 IDE 而言,PHPStorm 确实对使用特征的位置进行了一些智能检测,并在此基础上提供了一些自动完成功能,但总的来说,我不知道其他 IDE 对此的支持程度
  • @Devon 只是一个例子,没有人说我在使用 Laravel,我只是举个例子,大家明白我的意思。
  • @MarkYeltsin 然后不要标记 laravel...

标签: php laravel oop coding-style traits


【解决方案1】:

默认情况下,所有模型都已经拥有created_atupdated_at 属性,因为Illuminate\Database\Eloquent\Model 已经使用了Illuminate\Database\Eloquent\Concerns\HasTimestamps,它定义了getCreatedAtColumngetUpdatedAtColumn 方法HasTimestamps method getCreatedAtColumn

您不必定义自己的 HasTimestamps 这并不重要,因为提供该行为的所有实现都已经存在

【讨论】:

  • 这只是一个例子。我不使用 Laravel。我只是说我看到像 Laravel 的特征编码并询问是否可以。
  • 如果你不使用 Laravel 没关系。但是您必须在您将拥有其他可时间戳的模型的情况下定义特征,否则您可以直接在用户模型上定义该属性和方法
  • 是的,我会有另一个具有时间戳行为的模型。我想了解的是我应该如何定义属性。我应该直接在 trait 中定义它们还是需要在 Model 中定义它们并盲目使用 trait 的 getter?
  • 是的,就是这样。如果在Trait 中定义属性。您不会重复自己,因为您只需将 use Timestampable 放入您的模型中,这将在您的所有模型中一次附加 getter 和属性,而不是添加 use 并指定属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多