[英]Symfony2 Application Architecture - how to make a function available in all controllers?
我正在构建一个应用程序,其中用户绑定到帐户(例如,多个用户都共享一个帐户),然后是其他实体-可以称他们为产品绑定到帐户。 产品与帐户相关联,只有与该帐户绑定的用户才能编辑产品。
就我而言,不同之处在于,在同一模型中共享许多不同的实体。
如果这只是一个(产品)实体,那么在我的ProductRepository中拥有这样的方法就不是问题:
public function checkOwnership($id, $account)
{
$count = $this->createQueryBuilder('s')
->select('count(s.id)')
->where('s.account = :acc')
->andWhere('s.id = :id')
->setParameters(array('id' => $id, 'acc' => $account))
->getQuery()
->getSingleScalarResult();
if($count == 0)
throw $this->createNotFoundException('ye..');
return;
}
为了确保产品ID与用户帐户绑定在一起。
使用以下命令将account参数传递给此函数:
$this->getUser();
在控制器中。
使我可以将此功能提供给其他实体以防止代码重复的最佳方法是什么? (目前)只有3个其他实体,所以在每个存储库中都拥有它并不是世界末日,但是我只是想知道是否有一种方法可以创建一个“通用”或全局存储库遵循良好的标准? 我肯定想知道。
编辑:
还是我只是完全考虑了一下? 我可以仅在“ MainBundle”中创建“ Common”目录,定义名称空间并在需要访问该功能的控制器的开头添加use语句吗?
我希望我完全理解你的问题。
解决方案一,重复,简单 :让@ParamConverter
完成工作(如果不存在,则自动响应404
)
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
/**
* @Route("/pets/{id}")
*/
public function showAction(Pet $pet)
{
// Current logged user
$currentUser = $this->get('security.context')->getToken()->getUser();
// Owner
$ownerUser = $pet->getUser();
if(!$currentUser->equals($ownerUser)) {
// 401, 403 o 404 depends on you
}
}
解决方案二,DRY有点困难 :使用JMSAOPBundle并定义一个拦截器,该拦截器拦截对控制器和操作(显示,删除等)的所有请求。 切入点(连接到拦截器)将从上下文中获取当前用户,从实体中获取所有者。 然后你做检查...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.