2012-04-03 6 views
-4

UPDATE:Symfony2 Zugang Lehre Entity-Manager in benutzerdefinierter Klasse

Im Fall, dass Sie mit Entity-Manager in einer benutzerdefinierten Klasse arbeiten, können Sie diesen Weg gehen könnten:

diesen Code in Ihrem Bündel setzen:

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

So, jetzt können Sie EntityManager zugreifen:

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

Wenn Sie sagen "Arbeit mit" versuchen, es aus dem Servicebehälter ziehen oder versuchen, die Klasse neu? – Cerad

+0

Cerad, neue Klasse – VitalyP

+0

Das wird nicht funktionieren. Ich habe meine Antwort aktualisiert. – Cerad

Antwort

1

dieladenaus dem Bündel, müssen Sie ein bieten extension class:

// 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'); 
    } 
} 
+0

Nun, vielleicht gehe ich falsch. Ich werde nicht auf PostJob als Service zugreifen, ich erstelle nur ein neues Objekt von PostJob und möchte Entity Manager Objekt darin haben. – VitalyP

+0

Ich erhalte immer noch den Fehler "keine Angabe", wenn PostJob instanziiert wird. – VitalyP

2

ich keine Service-Datei wie folgt gesehen:

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

Wahrscheinlich sollte:

arguments: [@doctrine.orm.entity_manager] 

UPDATE:

Aufgrund einiger Kommentare scheint es, dass Sie versuchen, zu tun:

$job = new PostJob(); 

Und erwarten, dass Entity Manager irgendwie weitergegeben wird. Und so funktionieren die Dinge nicht. Sie müssen Folgendes tun:

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

Um die Symfony 2 Dependency-Injektion arbeiten zu lassen. Lesen Sie das Kapitel im Handbuch zu Services. Es mag zunächst etwas überwältigend erscheinen, aber sobald Sie ein paar Dienste in Betrieb nehmen, wird es zur zweiten Natur.

+0

Sehr nette Antwort, danke. In meinem Fall kann ich nicht $ this-> get ('postjob.service.id'); aber nur neues PostJob(); So, wie EM in diesem Fall zugreifen? – VitalyP

+0

Fügen Sie weitere Informationen zu Ihrer Frage hinzu, damit wir sehen können, woher Sie PostJob anrufen. Ich vermute, dass es eine Entität ist, was bedeutet, dass Sie Refactor verwenden müssen, wahrscheinlich mit den Lifecycle-Funktionen von Doctrine. – Cerad