Разделение объектов между 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 не хочет добавлять его, пока реализация не будет реорганизована. А пока воспользуйтесь моим решением выше:-)