很长一段时间以来,我一直在为数据库实体使用类似ActiveRecord的方法(静态类从数据库中检索行并实例化实体)。我知道这违反了单一责任原则,但对我来说这似乎更具人性。在阅读了很多篇文章后,AR是多么糟糕,我正试图获得数据映射器的心态",但我失败了。
我正在Symfony中试验Doctrine 2。我理解存储库的分离(它们从数据库中检索数据)和实体(它们保存数据)。我不知道的是,我应该在哪里放置保存上传文件的过程。
我们说我有用户实体,每个用户都可以保存他的照片。这张照片的路径应该存储在实体中,这一点很清楚。但是我在哪里定义路径?什么对象应该将上传的照片保存到目标路径?
我在这个主题上看过Symfony docs。他们在Entity对象中生成URL,但这是否也违反了单一责任原则?为什么实体(只保存数据)在文件系统上生成路径(甚至是相对的)?
这让我很烦恼。我无法找到正确的心态,能够看到DM的优势,因为它给我带来了很多复杂性。
答案 0 :(得分:3)
你是对的 - symfony文档中的例子违反了SR原则。
处理上传的更简洁方法是创建doctrine listener/subscriber,负责在您的实体之外处理此流程。
一个非常好的实现是VichUploaderBundle。
可以使用注释或YAML进行配置......
...通过KnpLabs提供(可选)与文件系统抽象库Gaufrette的集成......
......并且很容易设置。
如果您正在寻找实施示例,我绝对建议您尝试或浏览来源。
答案 1 :(得分:0)
这是我喜欢的两种不同的方法。
存储库/实体不应该关心上传,只需编写一个负责此任务的服务,并保留代表上传文件的“某些东西(自定义类型?或字符串......)”。
编写一个关心上传的事件监听器。 symfony文档中有一个丑陋的实现。