这些方法既有优点也有缺点。
我正在使用Yii开发一个中型应用程序。
Yii采用了AR模式,并默认支持它。使用存储库模式的优势非常明显,但问题是:我真的应该投入时间来实现与Yii相结合的存储库模式吗?
我也想知道你对这两种模式的看法。我也想知道为什么AR如此受欢迎和频繁使用?在我看来,Repository模式更灵活、更可测试、代码更干净,并且在企业应用程序中集成得更好。
我应该继续使用Yii的AR模式吗?
我也在考虑从Yii换成Laravel。在这一刻,我不会因为这样做而损失太多工作。
对我来说,ActiveRecord在小型项目中相当不错,但对于中型或大型应用程序来说,它很难维护。
Yii ActiveRecord的优点
- 使用Yii AR可以加快编码速度所有AR模型和控制器都可以通过gii一键生成
- AR非常受欢迎几乎所有的开发人员都熟悉这种模式。新的团队成员更快地投入到项目中
Yii ActiveRecord的缺点
在Yii的情况下,太多的逻辑集中在AR模型类中:
- 验证
- 查找方法
- 业务逻辑
这就产生了代码:
- 可读性较差AR类通常由几十个不相关的方法组成。逻辑可以使用行为或特征进行分解。但事实上,它仍然很难维持
- 难以测试
当应用程序变得足够大时,需要在Controller和AR模型之间添加一层。存储库是一个不错的选择。至于我,我开始在Laravel中使用存储库,但现在我也在Yii 1/2中使用它。
在Yii中实现存储库实际上不是问题。Yii的AR与Laravel的Eloquent非常相似。强制所有团队成员不要直接使用AR,而是使用存储库要困难得多。
如果你有Laravel的经验,我建议你使用它。
这取决于应用程序的类型:
-
复杂的业务应用程序(域)值得为存储库付出努力,原因如下:
- 可测试
- 数据源无知
- 使用接口使数据源适应您的域
-
小型应用程序(基本上是CRUD)只使用活动记录存储库可能会过度使用。
我使用Yii2活动记录装饰在存储库实现中,事实上,使用Yii2,你可以有一个真正的存储库实现,因为你可以使用ActiveQuery而不是ActiveRecord类本身,ActiveQuery可以返回原始数组数据:
namespace appcleaninfrastructure;
class ActiveRepository implements ActiveRepositoryInterface
{
protected $activeRecordClass;
protected $query;
protected $factory;
function __construct($activeRecordClass)
{
$this->query = new ActiveQuery($activeRecordClass);
$this->factory = new TheEntityFactoy;
}
public function findAll(){
$data = $this->query->asArray()->all();
return $this->factory->create($data);
}
}