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

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

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

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

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

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

1

Решение

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

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

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

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

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

Репозитории, которые мы только что написали, — это классы, которые определены как сервисы и получат соединение с доктриной в качестве инжектора конструктора. Затем вы можете получить соединение и работать с 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();
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]