Разделение объектов между doctrine2 odm и orm в symfony2 с расширениями доктрины

В моем проекте мне нужно делиться объектами между orm и odm. У меня есть сущность "Вариация" и документ "Отслеживание". Один вариант может содержать много событий отслеживания. Я пытался решить это с помощью ссылок на расширение доктрины, используя stofdoctrine extensionbundle для Symfony 2.3, но что бы я ни делал, это не сработает. Может быть, у кого-то из вас есть идея.

Документ отслеживания: (следите за изменениями в $)

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;
    }

Вариация Entity (следите за $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;
}

3 ответа

Обход проблемы циклических ссылок (если вы не можете решить ее с помощью 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 }

Может быть, попробовать от:

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" ] ]

Они оба работают на меня, но в одиночку...

Если вы поставите их обоих, как это только второй

При использовании ссылок на расширение доктрины вы должны убедиться, что вы зарегистрировали подписчика с доктриной. В противном случае ссылки не будут работать.

В symfony2 вы можете зарегистрировать слушателей / подписчиков доктрины, используя теги контейнера:

config.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 в компиляции пакета. Это просто упрощает процесс регистрации сервисов с использованием небольшого количества настроек.

Но, как вы можете видеть здесь... @stof еще не добавил эталонный слушатель к параметрам конфигурации.

Уже есть открытый запрос извлечения, но @stof не хочет добавлять его, пока реализация не будет реорганизована. А пока воспользуйтесь моим решением выше:-)

Другие вопросы по тегам