我刚开始使用教义,建立了一个简单的博客项目。我的要求之一是,在达到发布日期之前,任何人都不能看到博客文章(简单来说,跳过编辑界面)。
据我所见,使用自定义存储库是显而易见的。让我们把
find
方法如下:
public function find($id, $lockMode = null, $lockVersion = null)
{
/** @var Post $post */
$post = parent::find($id, $lockMode, $lockVersion);
if($post->getCreatedAt() > new \DateTime()) {
return null;
}
return $post;
}
这将限制对显示单个网页的访问
Post
实体。对于概述页面,可以使用自定义方法进行相同操作:
public function findForOverview()
{
$query = $this->createQueryBuilder('p')
->where('p.createdAt < CURRENT_TIMESTAMP()')
->orderBy('p.createdAt', 'DESC')
->getQuery();
return $query->getResult();
}
所以,即使对于这个简单的需求,我已经编写了两个自定义方法。如果我继续在我的项目上工作,可能会出现其他限制,并且可能会出现加载该实体的其他方法。据我所见,对于每种情况,我都必须实现所有访问保护的逻辑。
有没有更简单的方法?我在想一个注释或者“实体加载监听器”之类的东西,它使得为所有这些检查编写一个入口点变得简单——使得不可能忘记这些检查……