将Laravel模型扩展到一层以上是一种好的做法吗


Is it a good practice to extend Laravel models more than one layer?

我正在重新设计Laravel 5.1 上的一个项目

我意识到的是,旧的课程已经变得非常复杂,不再真正遵循"单一责任"原则。

所以我打算这样做:

<?php
class User extends Model
{
}
class SocialUser extends User
{
}

所以我有几个问题,

  1. 有可能做到这一点吗
  2. 如果是,那么SocialUser类是否链接回Users的同一数据库表?它是否与User模型本身冲突
  3. 这一切一开始都是好的设计实践吗?或者我更好地利用特质

谢谢。

您正在做的(扩展User模型)非常好,这是我自己在项目中使用的方法。

例如,如果我正在构建的应用程序具有类似商店的功能,那么我可以创建一个Customer模型,该模型扩展了我的User模型,并包含订单相关关系:

class Customer extends User
{
    public function orders()
    {
        return $this->hasMany(Order::class, 'customer_id');
    }
    public function worth()
    {
        return $this->orders()->sum(function ($order) {
            return $order->total();
        });
    }
}

在最近的一个项目中,我一直在研究电子邮件活动功能,并创建了一个Recipient类,该类扩展了User模型以添加与活动相关的方法:

class Recipient extends User
{
    public function campaigns()
    {
        return $this->belongsToMany(Campaign::class, 'recipient_id');
    }
}

因为这两个类都扩展了User模型,所以我得到了所有这些(和Eloquent)方法:

$customers = Customer::with('orders')->get();

只要您在基本User模型中设置了表,任何继承它的类都将使用同一个表,即使模型的名称可能不同(即CustomerRecipientStudent等)。

IMHO我会选择Repository模式。这对你的处境很有意义。

我会做以下事情:

interface UserRepository {
    public function find($id); 
    public function getAll(); 
    public function create(array $attributes);
    public function destroy($id);
    //you get the point
}
class CoreUserRepository implements UserRepository
{
     //implement the interface rules
}
class SocialUserRepository extends CoreUserRepository
{
     //implement the specific logic related to a SocialUser
}

更新

正如Mjh在评论中所描述的,在所有UserTypeRepository上简单地实现接口会导致重复——可能不是你想要的!

通过扩展CCD_ 12,您可以避免重复&保持一个适合你的情况的设计。

尽管在您的情况下,可以说您仍然遵循SRP,因为User模型中的所有内容都与用户有关,但不同的只是用户类型。

为什么选择存储库模式

  • 您正在确保您有一个所有User Repositories都需要执行的合同协议。

  • 代码更易于维护。

  • 业务和数据访问逻辑可以单独测试

你应该扩展你的用户模型吗

在这里你有模型污染的危险。虽然你可以用模型做任何事情——并不是所有的事情都是个好主意

用这种方法定义关系将是一件令人头疼的事情,因为这会造成混乱。

相关文章: