Как стать автором
Обновить

ZF2: Получить db adapter без использования service locator

Время на прочтение1 мин
Количество просмотров4.8K
Автор оригинала: Igor Korolchuk
Привет, читатели!

Многие разработчики начали изучать Zend framework 2 и, скорее всего, столкнулись с проблемой использования постоянного адаптера для базы данных. Я хотел бы поделиться с вами интересной статьей, которая помогла мне решить этот вопрос.



Проблема заключается в том, чтобы получить экземпляр TableGateway непосредственно, а не через service locator.
Объект TableGateway требует настроить объект dbAdapter, переданный в шлюз конструктора.

Следующее решение поможет решить эту проблему:

1. Используем GlobalAdaperFeature в качестве статического хранилища для dbAdapter:

use Zend\Db\TableGateway\Feature;
$feature = new Feature\GlobalAdapterFeature();


2. Добавить метод начальной загрузки (bootstrap) в файл конфигурации модуля:

public function onBootstrap($e)
{
    // set static adapter for all module table gateways

    $serviceManager = $e->getApplication()->getServiceManager();

    $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter');

    Feature\GlobalAdapterFeature::setStaticAdapter($dbAdapter);
}


3. Теперь можно получить доступ к уже загруженному dbAdapter объекта в конструкторе TableGateway:

public function __construct()
{
    $this->featureSet = new Feature\FeatureSet();

    $this->featureSet->addFeature(new Feature\GlobalAdapterFeature());

    $this->initialize();
}


Таким образом, мы имеем dbAdapter, внедренный в шлюз (gateway) конструктора. Конечно, это не лучшая практика, но это позволяет добавить некоторую гибкость в ваше приложение, но в любом случае объект dbAdapter был создан с помощью службы локатора (service locator), но как singleton метод для всех tableGateways на уровне модуля начальной загрузки.
Теги:
Хабы:
Всего голосов 9: ↑4 и ↓5-1
Комментарии6

Публикации

Истории

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург