Как получить доступ к базе в DependencyInjection?

Прошу сильно не пинать, я еще чайник.

Возникла задача загрузить некие юзерские настройки из базы. Админ пишет эти настройки в разделе Sonata Admin, а моя задача выдергивать их и использовать в разных местах. И что-то мне показалось не очень удобным дергать эти данные каждый раз. Решил попробовать загрузить эти настройки в сервис контейнер в DependencyInjection.


Возникло два вопроса:

1. Имеет ли право на жизнь такой подход?

2. Как получить доступ к базе из DependencyInjection?
  • Вопрос задан
  • 3175 просмотров
Пригласить эксперта
Ответы на вопрос 3
JekaRu
@JekaRu
Передайте в конструктор EntityManager

Пример:
class MyPropertyService{
  private $property1;
  // ....
  public function __construct(EntityManager $em){
    // ваш код  инициализации
    // $this->property1 = ...
  }
//...
}


<service id="my.property.service" class="Acme\SuperBundle\Services\MyPropertyService">
      <argument type="service" id="doctrine.orm.default_entity_manager"/>
</service>
Ответ написан
Комментировать
xilix
@xilix Автор вопроса
А откуда будет вызываться MyPropertyService? Из DependencyInjection вызвать его?
Ответ написан
Создавайте простой сервис:

use Doctirne\ORM\EntityManager;

class SettingLoader
{
  protected $em;
  public function __construct(EntityManager $em)
  {
    $this->em = $em;
  }

  public function get($key)
  {
    $val = $this->em->getRepository('MailBundle:Setting')->findOneBy(array('key' => $key));
    if (!$val) { throw new \InvalidArgumentException('Setting not found.'); }
    return $val;
  }
}


Ну и на последок сам сервис:

<service id="settings_loader" class="MyBundle\SettingLoader">
  <argument type="service" id="doctrine.orm.default_entity_manager" />
</service>


Ключ для дефоултного менежера: doctrine.orm.default_entity_manager
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы