0

我对 Doctrine2 很陌生,并且正在尝试设置自定义存储库,但是我遇到了一个错误,我似乎无法通过谷歌搜索:

这是实体:

// entities/Customer.php
namespace Entities;

/** @Entity (repositoryClass="Repositories\CustomerRepository") 
 *  @Table (name="customer") */
class Customer { /* ... */ }

这是存储库:

// repositories/CustomerRepository.php
namespace Repositories;
use Doctrine\ORM\EntityRepository;

class CustomerRepository extends EntityRepository {
  public function getAllEnterprises() {
    return $this->_em->createQuery(
      'SELECT c FROM Customer c WHERE column_x IS NOT NULL')->getResult();
  }
} 

PHP 冲我大喊:

PHP 致命错误:无法在第 10 行的实体/Customer.php 中重新声明类 Entities\Customer

PHP 5.4.6,通过作曲家安装的学说。

引导程序.php:

// bootstrap.php
if (!class_exists('Doctrine\Common\Version', false)) {
  require_once "bootstrap_doctrine.php";
}

require_once "entities/Customer.php";
require_once "repositories/CustomerRepository.php";
require_once "entities/Location.php";

bootstrap_doctrine.php

// bootstrap_doctrine.php
use Doctrine\ORM\Tools\Setup;
require_once "vendor/autoload.php";

// Create a simple "default" Doctrine ORM configuration 
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(
            array(__DIR__."/entities"), $isDevMode);

// database configuration parameters
$conn = array(
  'driver'      => 'pdo_mysql',
  'host'        => 'localhost',
  'user'        => 'someuser',
  'password'    => 'somepassword',
  'dbname'      => 'somename',
  'unix_socket' => '/var/run/mysqld/mysqld.sock',
);

// obtaining the entity manager
$entityManager = \Doctrine\ORM\EntityManager::create($conn, $config);

我究竟做错了什么?

4

1 回答 1

0

我得到了这份工作。看来问题与我发布的内容无关,而是与我用来测试它的代码有关。执行摘要(现在看来很明显)的->find()成员EntityManager和任何->getRepository()回报都完全不同。将它与引用没有命名空间的类结合起来,这就是发生的事情:

我有:

$customer = $em
  // ->getRepository('Customer')
  ->find('Customer', (int)$cid);

并试图取消注释第二行的工作。我在这里猜了一点,但我相信发生的事情是这以某种方式导致学说寻找一个类Customer(不是Entity\Customer),我告诉它我将我的实体保存在entities文件夹中......它在那里找到一个Customer.php......它愉快地尝试加载。

是的,这将重新定义Entity/Customer,这甚至不是它正在寻找的类。

此外,一旦我修复了您收到事务错误的问题,因为存储库(已经是正确的存储库Entity/Customer)不需要将类的名称作为第一个参数(回想起来,当然!)。

我不得不说,到目前为止,我从 Doctrine 得到的错误信息一直被证明基本上是无用的。这让我担心采用它。

感谢所有花时间查看此内容的人,以及将其正确标记为 Doctrine2 而不是 Doctrine 的人。

使用此作为参考的正确方法:

$em->getRepository('Entity\Customer')->find((int)$cid);

或者

$em->getRepository('Entity\Customer')->getAllEnterprises();
于 2013-01-17T02:26:04.103 回答