Подтвердить что ты не робот

Как вы получаете доступ к Doctrine DBAL в классе обслуживания Symfony2?

Я изучаю Symfony2 (и OOP) и хочу создать сервис, доступный во всем приложении. Эта служба принимает значение 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() undefined. Я застрял - как я могу использовать DBAL в сервисе? Благодарю!

4b9b3361

Ответ 1

Сначала вы должны добавить конструктор в свой класс и передать в @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, чтобы понять все возможности (инъекция Setter, Factory и т.д.) и лучше понять, как работает Injection Dependency.

Ответ 2

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

Теперь ваша конфигурация службы будет выглядеть следующим образом:

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