【发布时间】:2011-11-12 21:36:37
【问题描述】:
我将 Doctrine 与 Codeigniter 一起使用。所以我写了一个库类来一起使用它们。但我无法访问实体(在使用逆向工程从数据库创建它们之后)。 Doctrine 给出错误:致命错误:未捕获异常 'Doctrine\ORM\Mapping\MappingException' 并带有消息 'Class Actions 不是有效实体或映射的超类。'
我只是将这种情况的代码添加到库类中,一切正常,但是速度非常低:
$this->em->getConfiguration()
->setMetadataDriverImpl(
new DatabaseDriver(
$this->em->getConnection()->getSchemaManager()
)
);
我可以为这个错误做些什么?我用这个函数从数据库生成实体:
$cmf = new DisconnectedClassMetadataFactory();
$cmf->setEntityManager($this->em);
$metadata = $cmf->getAllMetadata();
$generator = new EntityGenerator();
$generator->setUpdateEntityIfExists(true);
$generator->setGenerateStubMethods(true);
$generator->setGenerateAnnotations(true);
$generator->generate($metadata, APPPATH."models/entities");
我的动作实体:
<?php
/**
* Actions
*
* @Table(name="actions")
* @Entity
*/
class Actions
{
/**
* @var integer $id
*
* @Column(name="id", type="integer", nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string $name
*
* @Column(name="name", type="string", length=45, nullable=false)
*/
public $name;
/**
* @var string $nameSafe
*
* @Column(name="name_safe", type="string", length=45, nullable=false)
*/
public $nameSafe;
/**
* Get id
*
* @return integer $id
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string $name
*/
public function getName()
{
return $this->name;
}
/**
* Set nameSafe
*
* @param string $nameSafe
*/
public function setNameSafe($nameSafe)
{
$this->nameSafe = $nameSafe;
}
/**
* Get nameSafe
*
* @return string $nameSafe
*/
public function getNameSafe()
{
return $this->nameSafe;
}
}
(编辑)我的图书馆代码:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
use Doctrine\Common\ClassLoader,
Doctrine\ORM\Configuration,
Doctrine\ORM\EntityManager,
Doctrine\Common\Cache\ArrayCache,
Doctrine\DBAL\Logging\EchoSQLLogger,
Doctrine\ORM\Mapping\Driver\DatabaseDriver,
Doctrine\ORM\Tools\DisconnectedClassMetadataFactory,
Doctrine\ORM\Tools\EntityGenerator;
/**
* CodeIgniter Doctrine Class
*
* initializes basic doctrine settings and act as doctrine object
*
* @author Mehmet Aydın Bahadır
* @link http://www.biberltd.com/
*/
class Doctrine {
/**
* @var EntityManager $em
*/
public $em = null;
/**
* constructor
*/
public function __construct()
{
// load database configuration from CodeIgniter
require APPPATH.'config/database.php';
// Set up class loading. You could use different autoloaders, provided by your favorite framework,
// if you want to.
require_once APPPATH.'third_party/Doctrine/Common/ClassLoader.php';
$doctrineClassLoader = new ClassLoader('Doctrine', APPPATH.'third_party');
$doctrineClassLoader->register();
$entitiesClassLoader = new ClassLoader('models', rtrim(APPPATH, "/" ));
$entitiesClassLoader->register();
$proxiesClassLoader = new ClassLoader('proxies', APPPATH.'models');
$proxiesClassLoader->register();
// Set up caches
$config = new Configuration;
$cache = new ArrayCache;
$config->setMetadataCacheImpl($cache);
$driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH.'models/entities'));
$config->setMetadataDriverImpl($driverImpl);
$config->setQueryCacheImpl($cache);
// Proxy configuration
$config->setProxyDir(APPPATH.'models/proxies');
$config->setProxyNamespace('Proxies');
// Set up logger
//$logger = new EchoSQLLogger;
//$config->setSQLLogger($logger);
$config->setAutoGenerateProxyClasses( TRUE );
// Database connection information
$connectionOptions = array(
'driver' => 'pdo_mysql',
'user' => $db['default']['username'],
'password' => $db['default']['password'],
'host' => $db['default']['hostname'],
'dbname' => $db['default']['database']
);
// Create EntityManager
$this->em = EntityManager::create($connectionOptions, $config);
// $this->generate_classes();
}
/**
* generate entity objects automatically from mysql db tables
* @return none
*/
public function generate_classes(){
// $this->em->getConfiguration()
// ->setMetadataDriverImpl(
// new DatabaseDriver(
// $this->em->getConnection()->getSchemaManager()
// )
// );
$cmf = new DisconnectedClassMetadataFactory();
$cmf->setEntityManager($this->em);
$metadata = $cmf->getAllMetadata();
$generator = new EntityGenerator();
$generator->setUpdateEntityIfExists(true);
$generator->setGenerateStubMethods(true);
$generator->setGenerateAnnotations(true);
$generator->generate($metadata, APPPATH."models/entities");
}
}
?>
【问题讨论】:
-
所以你删除了一些东西,因为它很慢,现在你问为什么它不起作用? :-) 你需要缓存你的元数据。
-
这不是缓存我的元数据吗? $cache = 新数组缓存; $config->setMetadataCacheImpl($cache);
-
如果您安装了 APC,请使用 ApcCache(如果您关心性能,则应该使用)
-
如何安装 APC Cache for Doctrine?
-
安装 PHP 的 APC 扩展。之后,将 ArrayCache 替换为 ApcCache。
标签: php codeigniter doctrine doctrine-orm