2

在我的项目中,我需要在 orm 和 odm 之间共享对象。我有一个实体“Variation”和一个文档“Tracking”。一种变体可以容纳许多跟踪事件。我试图通过使用 stofdoctrineextensionbundle 的 symfony 2.3 的理论扩展引用来解决它,但无论我做什么它都行不通。也许你们中的某个人有一个想法。

跟踪文件:(注意 $variation )

namespace Anchorbrands\Bundle\LandingpageBundle\Document;

use Anchorbrands\Bundle\LandingpageBundle\AnchorbrandsLandingpageBundle;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;


/**
 * @ODM\Document(collection="landingpage_tracking")
 */
class Tracking {

    /**
     * @Gedmo\ReferenceOne(type="entity", class="Anchorbrands\Bundle\LandingpageBundle\Entity\Variation", inversedBy="trackingEvents", identifier="variationId")
     */
    protected $variation;

    protected $variationId;

    public function setVariationId($variationId)
    {
        $this->variationId = $variationId;
    }

    public function getVariationId()
    {
        return $this->variationId;
    }

变体实体(注意 $trackingEvents )

/**
 * Variation
 *
 * @ORM\Table(name="landingpage_variation")
 * @ORM\Entity
 */
class Variation
{

/**
 * @Gedmo\ReferenceMany(type="document", class="Anchorbrands\Bundle\LandingpageBundle\Document\Tracking", mappedBy="variation")
 */
protected $trackingEvents;


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

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

3 回答 3

1

循环引用问题的解决方法(除非您可以使用 DI 解决它)@see stof's bundle

<?php

namespace ACME\CoreBundle\Listener;

use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class ReferencesListener
 *
 * @package ACME\CoreBundle\Listener
 */
class ReferencesListener extends \Gedmo\References\ReferencesListener
{
    /**
     * @var \Symfony\Component\DependencyInjection\ContainerInterface
     */
    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: ACME\CoreBundle\Listener\ReferencesListener
       arguments: ["@service_container"]
       tags:
           - { name: doctrine.event_subscriber, connection: default }
于 2014-04-16T16:13:52.620 回答
0

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

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

配置.yml

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

这是 StofDoctrineExtensionsBundle 通常在包的compilerpass中所做的。它只是简化了使用一些配置注册服务的过程。

但是正如您在此处看到的那样……@stof 尚未将引用侦听器添加到配置选项中。

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

于 2013-06-25T17:46:32.410 回答
0

也许尝试:

services:
    # reference behavior doctrine < mongodb
    gedmo.listener.reference:
        class: Gedmo\References\ReferencesListener
        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: Gedmo\References\ReferencesListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }

        calls:
            - [ setAnnotationReader, [ "@annotation_reader" ] ]
            - [ registerManager, [ 'document', "@doctrine_mongodb.odm.document_manager" ] ]

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

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

于 2013-07-16T16:59:56.863 回答