我是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行的entities / Customer.php
PHP 5.4.6,通过composer安装的学说。
bootstrap.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);
我做错了什么?
答案 0 :(得分:0)
我得到了这个工作。看来这个问题与我发布的内容无关,但是用我用来测试这个的代码。执行摘要(现在看来显而易见)->find()
成员EntityManager
和->getRepository()
返回的内容完全不同。将它与引用类没有它的命名空间相结合,这就是发生的事情:
我有:
$customer = $em
// ->getRepository('Customer')
->find('Customer', (int)$cid);
并试图取消对第二行的注释。我在这里猜一点,但我相信发生的事情是这会导致学说寻找一个班级Customer
(而不是Entity\Customer
),我告诉它我将我的实体留在{{1文件夹..然后它找到了一个entities
...它很乐意尝试加载。
是的,这将重新定义Customer.php
,这甚至不是它所寻找的类。
此外,一旦我修复了你得到一个事务错误,因为存储库(已经是Entity/Customer
的正确存储库)不需要该类的名称作为第一个参数(当然,回想起来,当然!)。
我不得不说,我从Doctrine获得的错误消息到目前为止一直被证明是无用的。这让我担心采用它。
感谢所有花时间看这个的人,以及任何正确标记为Doctrine2而不是Doctrine的人。
使用此参考的正确方法:
Entity/Customer
或
$em->getRepository('Entity\Customer')->find((int)$cid);