数据映射器模式,文件上载和单一责任原则与Doctrine 2

时间:2014-01-20 00:25:37

标签: php symfony design-patterns doctrine-orm datamapper

很长一段时间以来,我一直在为数据库实体使用类似ActiveRecord的方法(静态类从数据库中检索行并实例化实体)。我知道这违反了单一责任原则,但对我来说这似乎更具人性。在阅读了很多篇文章后,AR是多么糟糕,我正试图获得数据映射器的心态",但我失败了。

我正在Symfony中试验Doctrine 2。我理解存储库的分离(它们从数据库中检索数据)和实体(它们保存数据)。我不知道的是,我应该在哪里放置保存上传文件的过程。

我们说我有用户实体,每个用户都可以保存他的照片。这张照片的路径应该存储在实体中,这一点很清楚。但是我在哪里定义路径?什么对象应该将上传的照片保存到目标路径?

我在这个主题上看过Symfony docs。他们在Entity对象中生成URL,但这是否也违反了单一责任原则?为什么实体(只保存数据)在文件系统上生成路径(甚至是相对的)?

这让我很烦恼。我无法找到正确的心态,能够看到DM的优势,因为它给我带来了很多复杂性。

2 个答案:

答案 0 :(得分:3)

你是对的 - symfony文档中的例子违反了SR原则。

处理上传的更简洁方法是创建doctrine listener/subscriber,负责在您的实体之外处理此流程。

一个非常好的实现是VichUploaderBundle

可以使用注释或YAML进行配置......

...通过KnpLabs提供(可选)与文件系统抽象库Gaufrette的集成......

......并且很容易设置。

如果您正在寻找实施示例,我绝对建议您尝试或浏览来源。

答案 1 :(得分:0)

认为很难真正解决这个问题。

这是我喜欢的两种不同的方法。

  1. 存储库/实体不应该关心上传,只需编写一个负责此任务的服务,并保留代表上传文件的“某些东西(自定义类型?或字符串......)”。

  2. 编写一个关心上传的事件监听器。 symfony文档中有一个丑陋的实现。