Как вы получаете доступ к Doctrine DBAL в классе обслуживания Symfony2? - PullRequest
26 голосов
/ 04 августа 2011

Я изучаю Symfony2 (и ООП) и хочу создать сервис, который будет доступен в моем приложении.Эта служба принимает значение foo, проверяет его по таблице базы данных и возвращает строку значений.

У меня есть небольшой класс

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


}

Мои настройки:

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

Но выдает ошибку о том, что метод get () не определен.Я застрял - как я могу использовать DBAL в сервисе?Спасибо!

Ответы [ 2 ]

37 голосов
/ 04 августа 2011

Прежде всего, вы должны добавить конструктор в ваш класс и передать @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;
    }


}

Ваша конфигурация сервиса теперь должна выглядеть так:

parameters:
 my_service_connection: default

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

С этой конфигурацией вы говорите: «Сделайте мне службу с именем toolbox, которая получит службу doctrine.dbal.default_connection в качестве первого аргумента конструктора»

Существуют и другие методы инъекции, кроме инъекции в конструктор, и вам следует прочитать документацию http://symfony.com/doc/current/book/service_container.html, чтобы получить представление обо всех возможностях (инжекция сеттера, фабричная инъекция и т. Д.) И лучше понять, как работает инъекция зависимости

9 голосов
/ 07 февраля 2013

@doctrine.dbal.connection не работает, как говорит Игорь, @doctrine.dbal.connection - это реферат, используйте @doctrine.dbal.default_connection, если у вас есть только одно соединение с БД, или @doctrine.dbal.%connection_name%_connection, где %connection_name% заполнитель - имя соединения, которое вы хотите для инъекций.

Ваша конфигурация сервиса теперь должна выглядеть так:

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