Symfony 2-实体存储库-从存储库访问实体数据

Symfony 2-实体存储库-从存储库访问实体数据,symfony,Symfony,我有用户实体,它有自定义存储库。我已经创建了一个事件侦听器来检查给定的用户是否有权访问给定的游戏帐户 为此,我在我的用户存储库中创建了自定义函数hasAccountOfId($id)。但是,我在从事件侦听器访问此函数时遇到问题 用户实体: /** * @ORM\Entity(repositoryClass="AppBundle\Entity\UserRepository") * @ORM\Table(name="fos_user") */ class Us

我有
用户实体
,它有自定义存储库。我已经创建了一个事件侦听器来检查给定的用户是否有权访问给定的游戏帐户

为此,我在我的用户存储库中创建了自定义函数
hasAccountOfId($id)
。但是,我在从事件侦听器访问此函数时遇到问题

用户实体:

 /**
     * @ORM\Entity(repositoryClass="AppBundle\Entity\UserRepository")
     * @ORM\Table(name="fos_user")
     */
    class User extends BaseUser
    {
    /.../

    /**
     * @ORM\OneToMany(targetEntity="Account", mappedBy="user")
     */
    protected $accounts;
用户实体自定义存储库

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * UserRepository
 */
class UserRepository extends EntityRepository
{
    public function hasAccountOfId($accountId)
    {
            foreach ($this->accounts as $account) {
                if ($account.id ==  $accountId) {
                    return true;
                }
            }
            return false;
    }
}
返回:

试图调用类的名为“hasAccountOfId”的未定义方法 “AppBundle\Entity\User”

使用
时$userEm->hasAccountOfId($id)
结果是:

注意:未定义的属性:AppBundle\Entity\UserRepository::$accounts

如何访问用户存储库中的
$user=$this->token\u storage->getToken()->getUser()

  • 首先,对于这个简单的关联,您需要提供关系的
    所有者
    方面(在
    帐户
    类中)。通过为
    用户
    创建新的
    帐户
    ,您需要调用
    $Account->setUser($User)
    以建立
    关系

  • 其次,您不需要在
    RepositoryClass
    中使用自定义方法,因为您将从条令的关系中获取帐户:
    $user->getAccounts()

  • 通过
    Accounts
    查找
    ID
    的迭代不应在
    RepositoryClass
    实体
    本身中进行,而应使用
    Manager服务
    或其他方式,因为其他方式将违反
    单一责任原则


  • 最后,类属性或方法没有
    ,它必须是
    ->
    。注意
    如果
    hasAccountOfId
    方法中的
    语句。

    检查文档中的存储库类感谢您提供的线索,我已经根据此文档创建了存储库,但我的问题与基于从$this->token\u storage->getToken()->getUser()收到的用户信息访问此存储库有关。错误表示存储库类中存在未定义的属性
    $accounts
    。您需要编写查询来检查所提供的ID是否存在。检查
    DQL
    我想在此函数中访问的文档$accounts from class User。我应该将“用户对象(用户实体)”传递给“实体存储库”吗?或者可能有一个函数允许我访问给定实体的存储库?是的,只需将用户实体或其ID传递给该函数。您已经可以访问存储库类
    $userEm
    ,这是访问实体存储库类的正确方法。
    // Account is set, verify if user is authorized
                $id = $this->session->get("accountId");
                $user = $this->token_storage->getToken()->getUser();
                $userEm = $this->em->getRepository('AppBundle:User');
                if(!$user->hasAccountOfId($id))
                {
                    // Not authorized
                    die("Not authorized");
                }