【问题标题】:Gedmo Translatable integration in Doctrine 2.2 / ZendDoctrine 2.2 / Zend 中的 Gedmo 可翻译集成
【发布时间】:2012-02-12 10:20:20
【问题描述】:

我尝试将 Gedmo Translatable Extension 集成到 Doctrine 2.2/Zend 中,但没有成功,需要一些帮助。我总是收到这个致命错误:

未捕获的异常 'Doctrine\ORM\Mapping\MappingException' 与 消息'类 AliasStaticPage 不是有效实体 或映射的超类。 在[...]库/Doctrine/ORM/Mapping/MappingException.php:147

APC 正在运行,Doctrine 2.2 也运行良好(之前)。

这是我的引导程序(类似于Best practices for setting up with annotations):

    $cache = new \Doctrine\Common\Cache\ApcCache();      
    $config->setQueryCacheImpl($cache);
    $config->setResultCacheImpl($cache);
    $config->setMetadataCacheImpl($cache);

    $config->setProxyNamespace('App\Proxies');

    $annotationReader = new Doctrine\Common\Annotations\AnnotationReader();

    Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace(
        'Gedmo\Mapping\Annotation',
        '../library/DoctrineExtensions/Gedmo'
    );
    Doctrine\Common\Annotations\AnnotationRegistry::registerFile(
        '../library/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php'
    );

    $chainDriverImpl = new \Doctrine\ORM\Mapping\Driver\DriverChain();    
    $annotationDriver = new Doctrine\ORM\Mapping\Driver\AnnotationDriver($annotationReader,
            array(
            APPLICATION_PATH . '/models',
            '../library/DoctrineExtensions/Gedmo/Translatable/Entity'
            ));
    $chainDriverImpl->addDriver($annotationDriver, 'Entity');
    $chainDriverImpl->addDriver($annotationDriver, 'Gedmo\Translatable\Entity');

    $config->setMetaDataDriverImpl($chainDriverImpl);

这里是类定义的一部分:

<?php
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="alias")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorMap({"aliasProject" = "AliasProject",                    
 *                    "aliasStaticPage" = "AliasStaticPage"})
 */
abstract class Alias 
{
/**
 * @Id 
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;
[...] 
}

以及加入的班级:

<?php 
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="aliasStaticPage")
 */
class AliasStaticPage extends Alias
{

/**
 * @ManyToOne(targetEntity="StaticPage")
 * @JoinColumns({@JoinColumn(name="staticPage_id", referencedColumnName="id")})
 */
private $staticPage;
[...]
}

我也在doctrine-project.org 上尝试过这种方法,但没有成功...

非常感谢您的任何想法。

【问题讨论】:

  • 解决它.. 但直到 4 小时才能回答我的解决方案..

标签: zend-framework doctrine-orm


【解决方案1】:

所以这是我的解决方案:

以这种方式实现 AnnotationDriver 在第 93 行的 \Doctrine\ORM\Mapping\Driver\DriverChain 中导致了相同的对象哈希。不知道为什么,但它只循环了一次。所以我把它分成 2 个 annotationDrivers,一个用于我的模型,一个用于 Gedmo 实体:

$annotationReader = new Doctrine\Common\Annotations\AnnotationReader();
$annotationDriver1 = new Doctrine\ORM\Mapping\Driver\AnnotationDriver($annotationReader, array('../library/DoctrineExtensions/Gedmo/Translatable/Entity'));
$annotationDriver2 = new Doctrine\ORM\Mapping\Driver\AnnotationDriver($annotationReader, array(APPLICATION_PATH . '/models'));

$chainDriverImpl = new \Doctrine\ORM\Mapping\Driver\DriverChain();
$chainDriverImpl->addDriver($annotationDriver1, 'Gedmo\Translatable\Entity');
$chainDriverImpl->addDriver($annotationDriver2, 'Model');

接下来添加的驱动程序的命名空间不符合我的命名空间,这就是它永远不会最终查看类的方式。 我还必须将前缀 @ORM\ 添加到所有 ManyToOne、Join ...

就是这样。希望这可以帮助处于相同情况的其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多