如何从doctrine 2.0和Zend框架中的控制器访问自定义存储库?

时间:2011-05-11 11:43:19

标签: zend-framework doctrine-orm

我无法从doctrine 2.0和Zend框架中的控制器访问自定义存储库?

我的文件结构如下: -

application/controllers
       /configs
       /domain/
              Entities/User.php
                      /Mappings/User.php
              Proxies/
              Repositories/
vendor/
    Doctrine

在User.php中,我已经包含了这样的内容:

namespace Repositories;

use Doctrine\ORM\EntityRepository;

/**
 * @entity(repositoryClass="Repositories\UserRepository")
 * @Table(name="User")
 */
class User
{
}

即使我尝试了

namespace Entities;

use Doctrine\ORM\EntityRepository;

/**
 * @entity(repositoryClass="Entities\UserRepository")
 * @Table(name="User")
 */
class User
{
}

我已经通过命令为域/存储库生成了存储库。

现在我在文件夹域/存储库中有我自定义的存储库。 我想在我的UserController.php中访问ex:UserRepository 我试过这个。

$this->em = Zend_Registry::get('em');

$userlist = $this->em->getRepository('Repostories\User')->getusers();

输出:没有这样的文件或目录

如果我尝试过:

$this->em->getRepository('Entities\User')->getusers();

输出:缺少getusers()函数。你的函数应该由findBy

开始

请帮忙解决这个问题。

谢谢, 协西巴。

2 个答案:

答案 0 :(得分:12)

从存储库

开始
// Repositories/UserRepository.php
namespace Repositories;

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
    public function getusers()
    {
        // etc
    }
}

现在是实体

// Entities/User.php

namespace Entities;

/**
 * @Entity(repositoryClass="Repositories\UserRepository")
 */
class User
{
    // etc
}

如果您的自动加载器可以在RepositoriesEntities命名空间中找到类,则以下内容应该有效

$em->getRepository('Entities\User')->getusers();

答案 1 :(得分:3)

我同意Phil的观点,这很可能是自动加载的问题 - 我遇到了同样的问题。它通过向应用程序引导文件添加_init函数来解决,该文件包含我的服务,实体和存储库类的条目,如下所示。显然,你必须调整你的路径以匹配你的路径。我的结构在默认的Zend Framework模型目录中有Service,Entity和Repository目录。

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();

    require_once 'Doctrine/Common/ClassLoader.php';

    $serviceAutoloader = new \Doctrine\Common\ClassLoader('Service', APPLICATION_PATH . '/models');
    $autoloader->pushAutoloader(array($serviceAutoloader, 'loadClass'), 'Service');

    $entityAutoloader = new \Doctrine\Common\ClassLoader('Entity', APPLICATION_PATH . '/models');
    $autoloader->pushAutoloader(array($entityAutoloader, 'loadClass'), 'Entity');

    $repositoryAutoloader = new \Doctrine\Common\ClassLoader('Repository', APPLICATION_PATH . '/models');
    $autoloader->pushAutoloader(array($repositoryAutoloader, 'loadClass'), 'Repository');

    return $autoloader;
}