2011-08-04 31 views
23

Estoy aprendiendo Symfony2 (y OOP) y quiero crear un servicio que esté disponible en toda mi aplicación. Este servicio toma un valor foo, lo compara con una tabla de base de datos y devuelve una barra de valor.¿Cómo se accede a Doctrine DBAL en una clase de servicio de Symfony2?

que tienen un poco de clase

namespace Acme\TestBundle\Toolbox; 

class StringToolbox 
{ 
    public function lookupSomething($foo) 
    { 

     $conn = $this->get('database_connection'); 
     $sql = "SELECT bar FROM bar_list WHERE foo = :foo"; 
     $stmt = $conn->prepare($sql); 
     $stmt->bindValue("foo", $foo); 
     $stmt->execute(); 


     return $bar; 
    } 


} 

Mis valores son:

services: 
    toolbox: 
     class:  Acme\TestBundle\Toolbox 
     arguments: [@database_connection] 

Pero lanza un error diciendo que el método get() no está definido. Estoy atascado, ¿cómo puedo usar DBAL en el servicio? ¡Gracias!

Respuesta

34

En primer lugar se debe añadir un constructor para la clase y pase el @doctrine.dbal.%connection_name%_connection service

namespace Acme\TestBundle\Toolbox; 
use Doctrine\DBAL\Connection; 

class StringToolbox 
{ 
    /** 
    * 
    * @var Connection 
    */ 
    private $connection; 

    public function __construct(Connection $dbalConnection) { 
     $this->connection = $dbalConnection;  
    } 

    public function lookupSomething($foo) 
    { 

    $sql = "SELECT bar FROM bar_list WHERE foo = :foo"; 
    $stmt = $this->connection->prepare($sql); 
    $stmt->bindValue("foo", $foo); 
    $stmt->execute(); 


    return $bar; 
    } 


} 

la configuración del servicio ahora debería tener este aspecto:

parameters: 
my_service_connection: default 

services: 
toolbox: 
    class:  Acme\TestBundle\Toolbox\StringToolbox 
    arguments: [@doctrine.dbal.%my_service_connection%_connection] 

Lo que está diciendo con esta configuración es "hacerme un servicio denominado caja de herramientas que recibirá el servicio doctrine.dbal.default_connection como primer argumento de constructor"

Hay otros métodos de inyección, además de la inyección de constructor y usted debe leer la documentación http://symfony.com/doc/current/book/service_container.html de obtener una comprensión de todas las posibilidades (inyección Setter, inyección de fábrica, etc.) y para comprender mejor cómo la inyección de dependencias funciona

+0

Esto ayuda mucho! Los documentos de Symfony son geniales, pero suponen un conocimiento completo de POO, y tengo algunas lagunas. ¡Gracias! – Acyra

+0

Por alguna razón esto ya no funciona, tengo que pasar un argumento diferente: arguments: [@database_connection] – Acyra

+5

El servicio '@ doctrine.dbal.connection' es un resumen. Intenta usar '@ doctrine.dbal.% Connection_name% _connection' donde el'% connection_name% 'coloca el nombre de la conexión que deseas inyectar. –

9

@doctrine.dbal.connection no está trabajando, cuando Igor dice, @doctrine.dbal.connection es un resumen, use @doctrine.dbal.default_connection si solo tiene una conexión de base de datos o @doctrine.dbal.%connection_name%_connection donde el marcador de posición %connection_name% indica el nombre de la conexión que desea inyectar.

la configuración del servicio ahora debería tener este aspecto:

services: 
toolbox: 
    class:  Acme\TestBundle\Toolbox\StringToolbox 
    arguments: [@doctrine.dbal.default_connection] 
+0

Gracias por su respuesta. Si usamos '@ doctrine.dbal.% connection_name% _connection', ¿cómo pasamos el '% connection_name%' para la conexión deseada? – Nis

Cuestiones relacionadas