我无法理解让 Gedmo 学说扩展工作的示例。我并不完全理解所有各种配置位,但这是我认为相关部分的内容:
$cache = new \Doctrine\Common\Cache\ArrayCache;
$yamlDriver = new Doctrine\ORM\Mapping\Driver\YamlDriver(array(APPLICATION_PATH . $options['mappingDir']));
$config->setMetadataCacheImpl($cache);
$config->setQueryCacheImpl($cache);
$config->setMetadataDriverImpl($yamlDriver);
$em = \Doctrine\ORM\EntityManager::create($options['connection'], $config);
这是我目前的设置,它正在工作。YamlDriver 指向我的 Yaml 配置文件;我的实体在APPLICATION_PATH . '/entities/'
. 我不知道如何将我的实体放入命名空间,这可能是问题的一部分——我刚刚添加APPLICATION_PATH . '/entities/'
到我的包含路径中。
我认为我需要做的是以下(这取自教义扩展演示):
$cache = new Doctrine\Common\Cache\ArrayCache;
// standard annotation reader
$annotationReader = new Doctrine\Common\Annotations\AnnotationReader;
$cachedAnnotationReader = new Doctrine\Common\Annotations\CachedReader(
$annotationReader, // use reader
$cache // and a cache driver
);
// create a driver chain for metadata reading
$driverChain = new Doctrine\ORM\Mapping\Driver\DriverChain();
// load superclass metadata mapping only, into driver chain
// also registers Gedmo annotations.NOTE: you can personalize it
Gedmo\DoctrineExtensions::registerAbstractMappingIntoDriverChainORM(
$driverChain, // our metadata driver chain, to hook into
$cachedAnnotationReader // our cached annotation reader
);
// Replaced their entity annotations with my Yaml driver
$yamlDriver = new Doctrine\ORM\Mapping\Driver\YamlDriver(array(APPLICATION_PATH . $options['mappingDir']));
// register annotation driver for our application Entity namespace
$driverChain->addDriver($yamlDriver , 'Entity');
然后添加$driverChain
as with setMetadataDriverImpl()
。
但是,这是行不通的——可能是因为您不能在没有名称空间中的实体指向特定驱动程序的情况下使用 driverChain?
然后我需要让事件管理器工作:
$evm = new Doctrine\Common\EventManager();
$sortableListener = new Gedmo\Sortable\SortableListener;
$sortableListener->setAnnotationReader($cachedAnnotationReader);
$evm->addEventSubscriber($sortableListener);
但这不起作用——当我将 $evm 传递给我的实体管理器时,我收到一个错误:
致命错误:在第 157 行调用 D:\Jeremy\htdocs\umr\library\Gedmo\Mapping\ExtensionMetadataFactory.php 中未定义的方法 Doctrine\ORM\Mapping\Driver\YamlDriver::getLocator()
如果有人能对此有所了解,我将不胜感激!我怀疑只有在使用 中提到的类时才需要使用链接元数据驱动程序的第一部分,registerAbstractMappingIntoDriverChainORM()
但我不是——所以如果我需要做的就是让事件管理器运行,那就太好了——我改天再处理另一部分。