2012-03-22 5 views
6

Avevo bisogno di spostare il mio modello dal metodo del controller, quindi ho ricevuto aiuto per cambiarlo in un servizio. Il servizio funziona da solo, ma devo essere in grado di connettermi alla dottrina e al kernel dall'interno di questo servizio. All'inizio ho provato ad abilitare la dottrina, ma questo ha creato problemi. Come posso fare questo lavoro? Ho seguito i documenti e ho ottenuto questo codice. Non ho idea del motivo per cui ho ricevuto l'errore qui sotto. Grazie in anticipo per il tuo aiuto.Service DependencyInjection in Symfony2

La mia configurazione è:

CSVImport.php

namespace Tools\TFIBundle\Model; 

use Doctrine\ORM\EntityManager; 

class CSVImport { 
    protected $em; 

    public function __construct(EntityManager $em) { 
     $this->em = $em; 
    } 

app/config/config.yml

services: 
    csvimport: 
     class: Tools\TFIBundle\Model\CSVImport 
     arguments: [ @doctrine.orm.entity_manager ] 

azione controller

$cvsimport = $this->get('csvimport'); 

mio errore

Catchable Fatal Error: Argument 1 passed to 
Tools\TFIBundle\Model\CSVImport::__construct() must be an instance of 
Doctrine\ORM\EntityManager, none given, called in 
.../Tools/TFIBundle/Controller/DefaultController.php on line 58 and defined in 
.../Tools/TFIBundle/Model/CSVImport.php line 12 

EDIT, il mio codice di lavoro:

Service codice di classe con Kernel attaccato ad esso

namespace Tools\TFIBundle\Model; 

use Doctrine\ORM\EntityManager, 
    AppKernel; 

class CSVImport { 
    protected $em; 
    protected $kernel; 
    protected $cacheDir; 

    public function __construct(EntityManager $em, AppKernel $k) { 
     $this->em = $em; 
     $this->kernel = $k; 
} 

risposta

1

Prova iniettando @doctrine.orm.default_entity_manager.

+0

questo suggerimento mi ha aiutato a trovare un problema reale, la configurazione era ok, ma ho ricevuto nel codice controller una chiamata errata a quel servizio che ha causato quegli errori. – nysander

+0

La stessa cosa ha funzionato per ottenere una connessione DBAL. Qualcuno può spiegare qual è la logica dietro di esso? – Robert

1

Sul Web ho trovato come collegarmi a Doctrine DBAL per poter effettuare le interrogazioni da solo. Ma quando ho cambiato la mia configurazione a questo:

app/config.yml

services: 
    csvimport: 
     class: Tools\TFIBundle\Model\CSVImport 
     arguments: [ @doctrine.dbal.connection, @doctrine.orm.entity_manager, @kernel ] 

definizione di classe

namespace Tools\TFIBundle\Model; 

use Doctrine\ORM\EntityManager, 
    Doctrine\DBAL\Connection, 
    AppKernel; 

class CSVImport { 
    protected $c; 
    protected $em; 
    protected $kernel; 

    public function __construct(Connection $c, EntityManager $em, AppKernel $k) { 
     $this->c = $c; 
     $this->em = $em; 
     $this->kernel = $k; 
    } 

ho ottenuto l'errore:

RuntimeException: The definition "csvimport" has a reference to an abstract definition "doctrine.dbal.connection". Abstract definitions cannot be the target of references. 

Qualche idea?