Symfony2 доступ к Doctrine Entity Manager в пользовательском классе - PullRequest
0 голосов
/ 03 апреля 2012

UPDATE:

Если вам нужно работать с Entity Manager в пользовательском классе, вы можете пойти по этому пути:

поместите этот код в свой пакет:

use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\HttpFoundation\Request;
require_once DIR . '/../../../app/bootstrap.php.cache';
require_once DIR . '/../../../app/AppKernel.php';

class ApplicationBoot {
  private static $kernel;

  public static function getContainer() {
    if(self::$kernel instanceof \AppKernel) {
      if(!self::$kernel->getContainer() instanceof Container){
        self::$kernel->boot();
    }            
    return self::$kernel->getContainer();
  }

  $environment = 'prod';
  if (!array_key_exists('REMOTE_ADDR', $_SERVER) || in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1', 'localhost'))) {
    $environment = 'dev';
  }

  self::$kernel = new \AppKernel($environment, false);
  self::$kernel->boot();
  return self::$kernel->getContainer();
  }

  public static function shutDown() {
    self::$kernel->shutdown();
}}

Так что теперь вы можете получить доступ к EntityManager:

$container = ApplicationBoot::getContainer();
$entityManager = $container->get('doctrine')->getEntityManager();

Ответы [ 2 ]

2 голосов
/ 04 апреля 2012

Я не видел служебный файл, подобный этому:

arguments:
  entityManager: "@doctrine.orm.entity_manager"

Вероятно, должно быть:

arguments: [@doctrine.orm.entity_manager]

UPDATE:

Судя по некоторым комментариям, вы пытаетесь сделать:

$job = new PostJob();

И ожидая, что менеджер сущностей каким-то образом будет принят. И это не совсем так. Вам необходимо сделать:

$job = $this->get('postjob.service.id');

Чтобы включить внедрение зависимостей Symfony 2. Просмотрите главу в руководстве по услугам. Поначалу это может показаться немного запутанным, но как только вы запустите несколько сервисов, это станет второй натурой.

1 голос
/ 03 апреля 2012

Чтобы загрузить services.yml из вашего комплекта, вам нужно предоставить класс расширения :

// src/Vendor/YourBundle/DedendencyInjection/VendorYourBundleExtension.php

namespace Vendor\YourBundle\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension,
    Symfony\Component\DependencyInjection\ContainerBuilder,
    Symfony\Component\DependencyInjection\Loader\YamlFileLoader,
    Symfony\Component\Config\FileLocator;

class VendorYourBundleExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}
...