0

我正在构建一个应用程序,其中用户与帐户相关联(例如,多个用户都共享一个帐户),然后是其他实体 - 我们称它们为产品与帐户相关联。产品与帐户相关联,只有与该帐户绑定的用户才能编辑产品。

就我而言,不同之处在于,在同一模型中共享了许多不同的实体。

如果它只是一个(产品)实体,那么在我的 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 语句吗?

4

1 回答 1

1

我希望我完全理解你的问题。

解决方案一,重复,简单:让工作(如果不存在@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并定义一个拦截器来拦截对您的控制器和操作(显示、删除等)的所有请求。切入点(连接到拦截器)将从上下文中获取当前用户,从实体中获取所有者。然后你做检查...

于 2013-02-19T16:23:26.453 回答