Получить контейнер обслуживания от объекта в symfony 2.1 (Doctrine)

Как использовать сущность как службу в доктрине (используя Symfony 2.1).

Пример использования:

<?php

namespace MyNamespace;

class MyEntity
{
  protected $container = NULL;
  public function __construct($container)
  {
    $this->container = $container;
  }

  /** 
   * @ORM\PrePersist
   */
  public function() 
  {
    // Must call to container and get any parameters
    // for defaults sets entity parameters
    $this->container->get('service.name');
  }
}

В результате мне нужно получить доступ ко всему контейнеру.

Ответ 1

Сущность - это модель данных и должна содержать только данные (и не иметь зависимости от служб). Если вы хотите изменить свою модель в случае определенного события (PrePersist в вашем случае), вы должны посмотреть на создание прослушивателя Doctrine. Вы можете ввести контейнер при определении слушателя:

services:
    my.listener:
        class: Acme\SearchBundle\Listener\YourListener
        arguments: [@your_service_dependency_or_the_container_here]
        tags:
            - { name: doctrine.event_listener, event: prePersist }

Ответ 2

EDIT: ЭТО НЕ ПРЕДУСМОТРЕННЫЙ СПОСОБ, это единственный способ получить контейнер обслуживания внутри объекта, это не очень хорошая практика, его следует избегать, но это просто отвечает на вопрос.

Если вам все еще нужен контейнер и/или репозиторий, вы можете расширить базу abastractEntity следующим образом:

<?php

namespace Acme\CoreBundle\Entity;

/**
 * Abstract Entity 
 */
abstract class AbstractEntity
{
    /**
     * Return the actual entity repository
     * 
     * @return entity repository or null
     */
    protected function getRepository()
    {
        global $kernel;

        if ('AppCache' == get_class($kernel)) {
            $kernel = $kernel->getKernel();
        }

        $annotationReader = $kernel->getContainer()->get('annotation_reader');

        $object = new \ReflectionObject($this);

        if ($configuration = $annotationReader->getClassAnnotation($object, 'Doctrine\ORM\Mapping\Entity')) {
            if (!is_null($configuration->repositoryClass)) {
                $repository = $kernel->getContainer()->get('doctrine.orm.entity_manager')->getRepository(get_class($this));

                return $repository;
            }
        }

        return null;

    }

}