Используйте Symfony2 с PDO_odbc и используйте службы и репозитории для подключения и запросов.

Для моей компании я работаю над веб-приложением Symfony, которому необходимо извлекать пользователей и предприятия из базы данных. Однако я вынужден использовать соединение ODBC. Я использовал pdo_odbc, и он отлично работает с контроллером (подключение, запросы, выборка, рендеринг).

Но я немного не понимаю, как использовать сущности и репозитории, если я не могу использовать Doctrine для подключения.

Итак, что я делаю сейчас, так это подключаюсь к базе данных, выполняю запросы, извлекаю данные и отрисовываю представления в одной функции контроллера. Без использования сущностей или репозиториев это явно не то, чем должно быть.

Если кому-то из вас нужна дополнительная информация, не стесняйтесь комментировать.

PS: я новичок в Symfony в целом, поэтому примеры очень ценятся


person Kees Sonnema    schedule 23.11.2017    source источник


Ответы (1)


Мы делаем то же самое в некоторых проектах.

Мы сделали следующие шаги:

  • Пишите репозитории, но вместо использования Doctrine ORM и QueryBuilder мы просто используем соединение PDO с операторами PDO.

  • Мы создаем Модели вместо Сущностей. Каждая модель имеет функцию setFromDb(), которая получает массив данных. Эта информация будет сопоставлена ​​с атрибутами модели.

  • В сервисах, контроллерах мы работаем только с моделями.

Репозитории, которые мы написали, — это просто классы, которые определены как сервисы и получат подключение к доктрине как внедрение конструктора. Затем вы можете получить соединение и работать с PDO.

Пример класса репозитория (обратите внимание, что мы просто называем их репозиториями, потому что они обрабатывают запросы к базе данных, но они не имеют ничего общего с классами репозитория из Symfony/Doctrine)

class DemoRepositoryClass
{
    private $connection;

    public function __construct(Registry $doctrine)
    {
        // Get the database connection from doctrine
        $this->connection = $doctrine->getConnection();
    }

    public function test()
    {
        $query = "SELECT * FROM XXX WHERE FOO = 'BAZ";
        $stmt = $this->conncetion->prepare($query);
        // [...] Do as always with PDO;
    }

}

Этот класс будет определен как служба в файле services.yml.

app.demo_repository_class:
    class: AppBundle\Path\DemoRepositoryClass
    arguments: ['@doctrine']
    public: true

При этом вы можете вызывать сервисные функции из контроллера, например:

// In a controller action/function
$this->get('app.demo_repository_class')->test();
person KhorneHoly    schedule 23.11.2017
comment
Звучит как хороший способ справиться с этим, но не могли бы вы привести несколько примеров для репозиториев и сервисов? Я забыл добавить, что я также новичок в Symfony в целом. - person Kees Sonnema; 23.11.2017
comment
Часть соединения все еще немного fague. Я попытался добавить соединение с помощью файла parameters.xml, но это не сработало. В настоящее время я использую следующее в своих контроллерах $conn = new PDO('odbc:DSN', 'USER', 'PASS'); - person Kees Sonnema; 23.11.2017
comment
В наших проектах мы определяем связь в конфиге с доктриной. Если вы используете простой PDO, вы можете просто определить соединение в конструкторе класса репозитория и просто ввести данные соединения через службу из параметров. Итак, определите хост и т. Д. В параметрах и введите их вместо части «@dotrine» в services.ym. - person KhorneHoly; 23.11.2017
comment
@KeesSonnema хорошо, без проблем. Возможно, вы захотите удалить некоторые из своих комментариев, чтобы уменьшить шум, я добавил часть public: true в свой ответ. - person KhorneHoly; 24.11.2017