ozonar
@ozonar
PHP, JS, webRTC

Как в symfony обратиться к БД из статического класса?

Я создал статический класс внутри Symfony (без зависимостей самого Симфони) и хочу работать в нём с БД, используя Doctrine. Также у меня есть entity таблицы в БД и репозиторий для этого Entity.

Как я понял, мне не хватает ContainerInterface, который автоматически есть в генерируемом Symfony контроллере, но у меня нет контроллера.

Мануалы подсказывают мне, что есть вот такой способ:

/** @var FramePagesRepository */
protected $framePages;

public function __construct(FramePagesRepository $framePages) {
    $this->framePages = $framePages;
}


Но он уже выглядит слегка костыльно и требует динамически создаваемого класса, а у меня статический. К тому же, как я понял, инъекция не получится, даже если я создам этот класс динамически, потому что я сделаю это через new. Можно ли как-нибудь полностью отвязать работу с БД от структуры Симфони и обращаться к Репозиторию таблицы напрямую?

Ещё можно создать скрипт Symfony Console и взять EntityManager оттуда, протащив его при создании классов через new в нужные мне места, но это выглядит ещё костыльней.

Скорее всего, в силу малого опыта мой подход неверен в целом, поэтому опишу ситуацию целиком:

У меня есть symfony и websocket сервер Ratchet, работающий вне структуры Синфони, который общается с html страничкой. Сервер запускается с помощью запуска php скрипта через крон.
  • Вопрос задан
  • 396 просмотров
Решения вопроса 1
ozonar
@ozonar Автор вопроса
PHP, JS, webRTC
Можно получить коннект к БД через DBAL (слой абстракции, который работает поверх PDO).

$config = new \Doctrine\DBAL\Configuration();
$connectionParams = array(
    'dbname' => 'mydb',
    'user' => 'user',
    'password' => 'secret',
    'host' => 'localhost',
    'driver' => 'pdo_mysql',
);

$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);

$conn->createQueryBuilder()->select('*')
    ->from('users')
    ->where('id = :id')
    ->setParameter('id', 1);


Использовать абстракции моделей Симфони и вообще преимущества фреймворка (вроде DI) в таком случае не получится.

Аналога
User::find()->where(['email' => $email])->one();
в Symfony нет. Авторы Symfony против такой работы с БД, так как такой способ взаимодействия нарушает принципы SOLID
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы