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

时间:2015-08-11 10:21:33

标签: symfony

我有user entity个自定义存储库。我创建了一个事件监听器来检查给定用户是否有权访问给定的游戏帐户。

为此我在我的用户存储库中创建了自定义函数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功能。

// 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");
            }

返回:

  

尝试调用名为&#34; hasAccountOfId&#34;的未定义方法。班级   &#34;的appbundle \实体\用户&#34;

使用!$userEm->hasAccountOfId($id)会导致:

  

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

如何访问$user = $this->token_storage->getToken()->getUser()的用户存储库?

1 个答案:

答案 0 :(得分:2)

  1. 首先,对于这个简单的OneToMany关联,您需要提供关系的Owning方(在Account类中)。为Account创建新的User您需要致电$account->setUser($user);以制作Relation

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

  3. Accounts寻找ID的迭代不应该在RepositoryClassEntity本身,而是使用Manager Service或别的东西,因为其他方式会违反Singe Responsibility Principle

  4. 最后,类属性或方法没有.,它必须是->。请注意if方法中的hasAccountOfId语句。