Как использовать объект как службу в доктрине (с использованием 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'); } }
В результате мне нужно получить доступ ко всему контейнеру.
Сущность – это модель данных и должна содержать только данные (и не иметь зависимости от служб). Если вы хотите изменить свою модель в случае определенного события (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 }
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; } }