在带有条令扩展的symfony2中,doctrine2-odm和orm之间共享对象



在我的项目中,我需要在orm和odm之间共享对象。我有一个实体"变体"和一个文档"跟踪"。一种变体可以容纳许多轨迹事件。我试图通过使用symfony 2.3的stofdoctrineextensionbundle的条令扩展引用来解决它,但无论我做什么,它都不起作用。也许你们中的某个人有个主意。

跟踪文档:(注意$variation)

namespace AnchorbrandsBundleLandingpageBundleDocument;
use AnchorbrandsBundleLandingpageBundleAnchorbrandsLandingpageBundle;
use GedmoMappingAnnotation as Gedmo;
use DoctrineODMMongoDBMappingAnnotations as ODM;

/**
 * @ODMDocument(collection="landingpage_tracking")
 */
class Tracking {
    /**
     * @GedmoReferenceOne(type="entity", class="AnchorbrandsBundleLandingpageBundleEntityVariation", inversedBy="trackingEvents", identifier="variationId")
     */
    protected $variation;
    protected $variationId;
    public function setVariationId($variationId)
    {
        $this->variationId = $variationId;
    }
    public function getVariationId()
    {
        return $this->variationId;
    }

变体实体(注意$trackingEvents)

/**
 * Variation
 *
 * @ORMTable(name="landingpage_variation")
 * @ORMEntity
 */
class Variation
{
/**
 * @GedmoReferenceMany(type="document", class="AnchorbrandsBundleLandingpageBundleDocumentTracking", mappedBy="variation")
 */
protected $trackingEvents;

public function getTrackingEvents()
{
    return $this->trackingEvents;
}
public function setTrackingEvents(Collection $trackingEvents)
{
    $this->trackingEvents = $trackingEvents;
}

循环引用问题的解决方法(除非您可以使用DI解决)@请参阅stof的捆绑包

<?php
namespace ACMECoreBundleListener;
use SymfonyComponentDependencyInjectionContainerInterface;
/**
 * Class ReferencesListener
 *
 * @package ACMECoreBundleListener
 */
class ReferencesListener extends GedmoReferencesReferencesListener
{
    /**
     * @var SymfonyComponentDependencyInjectionContainerInterface
     */
    private $container;
    /**
     * @var array
     */
    protected $managers
        = [
            'document' => 'doctrine.odm.mongodb.document_manager',
            'entity'   => 'doctrine.orm.default_entity_manager'
        ];
    /**
     * @param ContainerInterface $container
     * @param array              $managers
     */
    public function __construct(ContainerInterface $container, array $managers = array())
    {
        $this->container = $container;
        parent::__construct($managers);
    }
    /**
     * @param $type
     *
     * @return object
     */
    public function getManager($type)
    {
        return $this->container->get($this->managers[$type]);
    }
} 

侦听器定义

acme.listener.reference:
       class: ACMECoreBundleListenerReferencesListener
       arguments: ["@service_container"]
       tags:
           - { name: doctrine.event_subscriber, connection: default }

当使用条令扩展的引用时,您需要确保您已经用条令注册了订阅者。否则引用将不起作用。

在symfony2中,您可以使用容器标签注册条令侦听器/订阅者:

config.yml

services:
    gedmo_reference_listener:          # choose whatever name you like
        class: GedmoReferencesReferencesListener
        arguments: 
            - { entity: @doctrine.orm.entity_manager, document: @doctrine.odm.mongodb.document_manager }
        tags:
            - { name: doctrine.event_subscriber, connection: default }

这就是StofDoctrineExtensionBundle通常在bundle的compilepass中所做的。它只是使用一些配置简化了注册服务的过程。

但正如你在这里看到的@stof还没有将引用侦听器添加到配置选项中。

已经有一个打开的pull请求,但@stof在重构实现之前不想添加它。同时使用我上面的解决方案:-)

也许可以从尝试

services:
    # reference behavior doctrine < mongodb
    gedmo.listener.reference:
        class: GedmoReferencesReferencesListener
        tags:
            - { name: doctrine_mongodb.odm.event_subscriber }
        calls:
            - [ setAnnotationReader, [ "@annotation_reader" ] ]
            - [ registerManager, [ 'entity', "@doctrine.orm.default_entity_manager" ] ]
    # reference behavior doctrine > mongodb
    gedmo.listener.reference:
        class: GedmoReferencesReferencesListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
        calls:
            - [ setAnnotationReader, [ "@annotation_reader" ] ]
            - [ registerManager, [ 'document', "@doctrine_mongodb.odm.document_manager" ] ]

他们都为我工作,但都是一个人。。。

如果你把它们都这样放,只有第二个是

最新更新