querybuilder - symfony doctrine onetomany
¿Cómo se accede a Doctrine DBAL en una clase de servicio Symfony2? (2)
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.
Tengo una pequeña 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;
}
}
Mi configuración es:
services:
toolbox:
class: Acme/TestBundle/Toolbox
arguments: [@database_connection]
Pero arroja un error que dice que el método get () no está definido. Estoy atascado, ¿cómo puedo usar DBAL en el servicio? ¡Gracias!
En primer lugar, debe agregar un constructor a su clase y pasar el servicio @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 de tu servicio ahora debería verse así:
parameters:
my_service_connection: default
services:
toolbox:
class: Acme/TestBundle/Toolbox/StringToolbox
arguments: [@doctrine.dbal.%my_service_connection%_connection]
Lo que dices con esta configuración es "hazme un servicio llamado toolbox que recibirá el servicio doctrine.dbal.default_connection como el primer argumento constructor"
Hay otros métodos de inyección además de la inyección de Constructor y debe leer la documentación de http://symfony.com/doc/current/book/service_container.html para obtener una idea de todas las posibilidades (inyección de Setter, inyección de fábrica, etc.) y para mejorar entender cómo funciona la Inyección de Dependencia
@doctrine.dbal.connection
no funciona, Como dice Igor, @doctrine.dbal.connection
es un resumen, use @doctrine.dbal.default_connection
si solo tiene una conexión db, o @doctrine.dbal.%connection_name%_connection
donde el %connection_name%
placeholder el nombre de la conexión que desea inyectar.
La configuración de tu servicio ahora debería verse así:
services:
toolbox:
class: Acme/TestBundle/Toolbox/StringToolbox
arguments: [@doctrine.dbal.default_connection]