我正在Laravel 5.1上重建一个项目
我意识到旧课程变得非常复杂,并且不再遵循“单一责任”原则了。
所以我打算这样做:
<?php
class User extends Model
{
}
class SocialUser extends User
{
}
所以我有几个问题,
谢谢。
答案 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
需要实施的合同协议。
代码更易于维护。
业务和数据访问逻辑可以单独测试
这里存在模型污染的危险。虽然你可以对模型做任何事情 - 并非一切都是好主意。
由于引起的混乱,定义这种方法的关系会很头疼。