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 最适用于所有模型都具有共同的 特征 但行为(功能)独特的情况。例如,Car
s 和 Motorcycle
s 都是 Vehicle
s。它们具有共同的特征(例如前大灯、指示灯、发动机、变速箱等),但是如何 operate()
它们在 class 到 class 之间是独一无二的。
另一方面,当使用 classes(或本例中的 Eloquent 模型)需要共同的 功能 时,可以更好地使用特征(即方法)尽管具有不同的特征。
在不了解您的项目的情况下,您似乎正在寻找后者,每个模型都具有共同的功能(可能 addToCalendar()
、reschedule()
等),尽管它们具有不同的特征。
我们正在开发一个带有调度模块的 Laravel 应用程序。该模块具有三种类型的 classes 可以放入议程中:任务、事件和部门。因此,我们提出了以下 class 图:
可规划模型:
<?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 最适用于所有模型都具有共同的 特征 但行为(功能)独特的情况。例如,Car
s 和 Motorcycle
s 都是 Vehicle
s。它们具有共同的特征(例如前大灯、指示灯、发动机、变速箱等),但是如何 operate()
它们在 class 到 class 之间是独一无二的。
另一方面,当使用 classes(或本例中的 Eloquent 模型)需要共同的 功能 时,可以更好地使用特征(即方法)尽管具有不同的特征。
在不了解您的项目的情况下,您似乎正在寻找后者,每个模型都具有共同的功能(可能 addToCalendar()
、reschedule()
等),尽管它们具有不同的特征。