繁体   English   中英

具有学说的Symfony2用户

[英]Symfony2 users with doctrine

我正在寻找获取用户创建内容的最佳实践。 我有$ user对象形式'security.context',我需要通过一些$ record_id获得该用户创建的单个记录,

那我该怎么办?

$this->getDoctrine()->getRepository('AcmeRecordBundle:Record')
->findOneBy(array( 'id' => $record_id, 'user' => $user->getId() ));

这对我来说看起来不太好,因为我有很多需要获取的信息也在寻找用户(不要让其他用户尝试通过某个id获取它)。 对于任何内容(个人照片,其他一些私人内容),我必须传递'user'=> $ user-> getId()?

或者最好用所有这些函数创建UserRepository? getRecordById($ id),getPhotoById($ id),getPrivateInformationById($ id)等。

我正在使用Rails一点,在那里我能够定义current_user方法

def current_user
  return @current_user if defined?(@current_user)
  # ....
end

然后用它作为

current_account.records.find(params[:id])

使用Doctrine2和Symfony2是否有可能使它像这样工作? 喜欢

$user->getRecords()->find($recordId)

在任何情况下,你必须指定user ,你传递给你的函数,如指定其处理的定制仓库里取逻辑官方文档的学说。

当然你必须传递用户的id为“WHERE”sql子句,只是因为ROR在幕后神奇地做了它(这是一个非常糟糕的做法imo),并不意味着它根本没有做到。

至于其他问题,两种解决方案都可以:

  1. 从特定存储库中获取数据,并传递对象ID +用户的ID,或者:
  2. 创建内部获取用户id并将其置于查询中的方法

并且请记住,在请求期间仅提取用户的id 一次 ,因此不必担心从安全上下文中获取它太多。

您需要实现Symfony 2 ACL功能。 这允许您指定“域对象”(DB类的各个实例)的所有权以及用户对域对象具有哪种访问权限。 然后,您可以使用例如JMSSecurityExtraBundle并基于对象所有权实现访问控制。 一旦实现,您的用户将无法修改彼此的对象(通过参数操作),您将不需要查询中的其他参数。

以下是一些相关链接:

  1. 访问控制列表(ACL)
  2. JMSSecurityExtraBundle

就个人而言,我发现存储库类在中小型应用程序中有点膨胀。 不确定你的方法是什么,但我读过的大多数内容(以及我在最近的Doctrine 2应用程序中发布的内容)都是有一个操作实体的“服务”层。 这是D2中的b / c,在实体中实现保存/删除等会破坏系统的目的,即减轻实体持久性的知识并将它们视为Plain Old Php Objects(TM);)

对我的查询看起来很奇怪的事情是传递主键ID和用户ID来获取用户。 在我看来,像用户表的pk将是用户ID,或者至少如果用户ID不是pk(不知道为什么会这样)你应该能够获得记录w /只是峰。 这是在我的系统中获取User对象的方法

/**
 * @param int $iId user id
 *
 * @return object
 */
public function fetch($iId)
{
    return $this->_oEm->find('AwesomeApp\Entity\User', $iId);
}

您正在寻找的当前用户类型的功能应该与您的应用程序中的会话相关。 在zf中我创建了一个会话处理程序,它将doctrine User对象持久保存到会话存储,然后在读取会话时,我将User对象重新附加到Entity Manager。 您可能希望在sf中执行类似的操作,然后“getCurrentUser”调用将返回与从数据库中提取相同的User对象。 在会话中存储User对象可以防止在每次加载页面时返回数据库,例如,如果您只是在会话中存储了User id。

在一天结束时,您“应该”将复杂的选择查询放入存储库,但这显然留给了用户自行决定最佳实践。 在这种情况下,当你只有一个pk时,我会说编写一个存储库类是没有意义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM