我正在重新设计Laravel 5.1 上的一个项目
我意识到的是,旧的课程已经变得非常复杂,不再真正遵循"单一责任"原则。
所以我打算这样做:
<?php
class User extends Model
{
}
class SocialUser extends User
{
}
所以我有几个问题,
- 有可能做到这一点吗
- 如果是,那么SocialUser类是否链接回Users的同一数据库表?它是否与User模型本身冲突
- 这一切一开始都是好的设计实践吗?或者我更好地利用特质
谢谢。
您正在做的(扩展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
模型中设置了表,任何继承它的类都将使用同一个表,即使模型的名称可能不同(即Customer
、Recipient
、Student
等)。
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
都需要执行的合同协议。代码更易于维护。
业务和数据访问逻辑可以单独测试
你应该扩展你的用户模型吗
在这里你有模型污染的危险。虽然你可以用模型做任何事情——并不是所有的事情都是个好主意
用这种方法定义关系将是一件令人头疼的事情,因为这会造成混乱。