我正在做一个Symfony4DoctrineMySQL项目,需求如下。
用户可以创建实体(比如说帖子),这些实体只有在管理员批准后才能在公共前台显示。
当用户在审批发布后编辑自己的帖子时,修改后的帖子需要再次被审批,才能在前台显示。但是在审批过程中,旧的已批准版本的帖子必须在前台保持可见。
这意味着我必须为每个 "Post "实体保留两个版本:前台是已批准的版本,后台是正在进行中的版本。
在过去有类似需求的项目中,我尝试过不同的方法来解决这个问题。
使用 "可版本行为"(这是在Symfony1Propel时代使用sfPropelVersionableBehaviorPlugin)。为了在前端显示,如果一个实体没有被批准,我必须获取之前的版本,直到找到最新的批准版本。
使用第二个entitydatabase表 "ApprovedPost",其字段定义与主 "Post "实体相同。当一个帖子被管理员批准后,它将被复制到ApprovedPost表中。前台只对 "ApprovedPost "表进行操作。
目前实现这种行为的最佳实践是什么?
因为我现在正在研究这个问题,所以我想分享一下我的方法,实体是对某个东西的请求。每当某件事情发生变化时,这些变化都应该被保存下来。
这个方法。
(WHERE id = ?1 OR WHERE parent-id = ?1) AND WHERE approved = true SORT BY created_at DESC LIMIT 1
可以添加更多的功能,如enableddisabled,delete等。
如果你想在服务器端渲染页面并显示变化的或旧的版本,我建议你写一个Twig扩展。你可以在repo中实现不同的搜索功能,并通过扩展来处理表现(排序,引用...)。我创建了一个API,它能够同时做到这两点:返回最新版本和返回所有版本(有或没有root或newest),但我只在必要时在前端使用后者。
就像dbrumann所说的那样,这是一种有观点的方法(我喜欢自定义的repos,因为我可以创建类型安全的repos,而且我可以将应用程序与持久化逻辑解耦)。