Laravel: 使用 Trait 和扩展模型的区别

Laravel: difference between using a Trait or extending a model

我们正在开发一个带有调度模块的 Laravel 应用程序。该模块具有三种类型的 classes 可以放入议程中:任务、事件和部门。因此,我们提出了以下 class 图: 现在,我们的问题是:如果我们要实现这个图,我们应该使用 Trait 还是应该扩展 Plannable 模型。

可规划模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Plannable extends Model
{
    // Code
}

任务模型:

<?php

namespace App;

use App\Plannable;

class Task extends Plannable
{
    // Code
}

或者我们应该将其用作特征:

可规划特征:

<?php

namespace App\Traits;

trait Plannable
{
    // Code
}

任务模型:

<?php

namespace App;

use App\Plannable;
use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    use Plannable;
    // Code
}

当您尝试扩展 class 时,意味着 "is a" 关系,Car extends Vehicle,Car "is a" Vehicle。在您的示例中,任务 "is a" 可计划。是吗?

另一方面,特征使用不同的方法,有点像 "Car uses wheels"。同样在您的示例中,Task 使用 Plannable。我想看起来比扩展更好?

如果不了解您将为此实现赋予哪些功能,就很难多说。我希望,它能提供一些想法。

扩展 parent/abstract class 最适用于所有模型都具有共同的 特征 但行为(功能)独特的情况。例如,Cars 和 Motorcycles 都是 Vehicles。它们具有共同的特征(例如前大灯、指示灯、发动机、变速箱等),但是如何 operate() 它们在 class 到 class 之间是独一无二的。

另一方面,当使用 classes(或本例中的 Eloquent 模型)需要共同的 功能 时,可以更好地使用特征(即方法)尽管具有不同的特征。

在不了解您的项目的情况下,您似乎正在寻找后者,每个模型都具有共同的功能(可能 addToCalendar()reschedule() 等),尽管它们具有不同的特征。