将Laravel模型扩展到多个层是一个好习惯吗?

时间:2015-11-04 09:58:39

标签: php laravel eloquent laravel-5.1

我正在Laravel 5.1上重建一个项目

我意识到旧课程变得非常复杂,并且不再遵循“单一责任”原则了。

所以我打算这样做:

<?php

class User extends Model
{

}

class SocialUser extends User
{

}

所以我有几个问题,

  1. 有可能实现吗?
  2. 如果是,那么 SocialUser 类链接回到 Users 的同一数据库表,是否会与 User 模型冲突本身?
  3. 这首先是一个好的设计实践吗?或者我最好利用特质?
  4. 谢谢。

2 个答案:

答案 0 :(得分:2)

你正在做的事情(扩展User模型)非常好,我在项目中使用的方法。

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

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模型中设置表,任何继承它的类都将使用相同的表,即使模型的名称可能不同(即Customer,{{1 },Recipient等。)

答案 1 :(得分:0)

恕我直言,我会选择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上实现接口导致重复 - 可能不是你想要的!

通过扩展您的CoreUser,您可以避免重复&amp;保持适合您情况的设计。

虽然在您的情况下可能会认为您仍在关注SRP,因为User模型中的所有内容都与用户相关,但它只是用户的类型不同。

为什么选择存储库模式?

  • 您确保签订了所有User Repositories需要实施的合同协议。

  • 代码更易于维护。

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

您是否应该扩展用户模型?

这里存在模型污染的危险。虽然你可以对模型做任何事情 - 并非一切都是好主意。

由于引起的混乱,定义这种方法的关系会很头疼。

相关问题