LINUX.ORG.RU

Передача экземпляра PDO в родитель модели MVC

 ,


0

1

Приветствую. Уже который день ломаю голову как передать экземпляр PDO в родитель модели (чтобы все потомки имели методы для работы с БД, которые, основываются на экземпляре PDO). Был такой вариант:

Не переопределять конструктор в дочерней модели (он унаследуется) и передавать экземпляр PDO в дочернюю аргументом (родительский конструктор будет записывать экземпляр в свойство).

Итог: все вроде бы хорошо, но в моей системе, модель в виде ORM (создается экземпляр в контроллере). В этом случае, нужно, передавать объект подключения из свойства контроллера в конструктор модели (вручную!).

А чтобы экземпляр PDO был в свойстве контроллера нужно:

1) Передавать объект подключения в необходимый контроллер:

$controllerObject = new $controllerName($pdo);

2) При этом, дочерний класс не должен переопределять конструктор родительского контроллера, который записывает экземпляр PDO в свойство:

function __construct($pdo) {
  $this->pdo = $pdo;
}

Какие варианты тут могут быть? Как передается объект подключения в популярных MVC CMS и CMF? Заранее благодарю! :)

★★

Последнее исправление: Razip (всего исправлений: 1)

Какие варианты тут могут быть?

А зачем вообще кому-то передавать экземпляр ДБ-коннектора? В наше время коннект к БД занимает столь пренебрежимое время, что соединение имеет смысл устанавливать при каждом запросе и потом закрывать. Это не добавит к нагрузке и десятой доли процента. Вообще, я в результатах профайлинга никогда не видел установления соединения, так что, скорее всего, оно и меньше тысячных долей процента займёт.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ну хорошо, допустим надо передать не экземпляр PDO, а например — настройки к подключению (записываются в переменную из файла). Им придется пройти такой же путь?

Razip ★★
() автор топика

чтобы все потомки имели методы для работы с БД, которые, основываются на экземпляре PDO

Это все конечно здорово, но, по-моему, в большинстве случаев разумнее использовать просто сервис-локатор для хранения соединения с БД.

Dobriy_i_Prostoy
()
Ответ на: комментарий от Razip

Соединение с БД не протаскивается в каждый объект. Для его получения модель использует сервис-локатор. Ну или какой-то синглтон или статический класс. Если используется только одно соединение с БД, имхо нет никакого смысла усложнять с протаскиванием соединения. Если несколько, тут уже могут быть варианты.

Dobriy_i_Prostoy
()
Ответ на: комментарий от Dobriy_i_Prostoy

Статический класс мне подойдет. Спасибо.

Razip ★★
() автор топика

Ты хочешь, чтобы был везде только один эксземпляр PDO?

Правильно тебе сказали насчет статического класса в общем.

Например так:

Application::getConnection() -> Connection, где Application статический класс, как правило всегда один и доступен везде. В нем например приватное статическое поле: self::$_conn

getConnection() возвращает сслыку на класс-контейнер для PDO или чего-то другого или собственно ссылка на экземпляр PDO.

swwwfactory ★★
()
Последнее исправление: swwwfactory (всего исправлений: 1)
Ответ на: комментарий от swwwfactory

Да-да, я уже решил так поступить.

Razip ★★
() автор топика

Спасибо всем!

Razip ★★
() автор топика
Ответ на: комментарий от Razip

Ну хорошо, допустим надо передать не экземпляр PDO, а например — настройки к подключению

Я у себя такое храню в настройках хостинга. Один из немногих статических параметров.

KRoN73 ★★★★★
()

Какие еще PDO, MVC? PHP создан для того чтобы писать в процедурном стиле, обрабатывать события в switch-case и делать прямые запросы к базе данных без всяких PDO, DAO и прочих абстракций. Зачем пытаться прыгнуть выше головы, если заранее известно, что ничего не выйдет?

Какие варианты тут могут быть?

Попробовать писать логику на языке программирования, а не убогом шаблонизаторе.

crowbar
()
Ответ на: комментарий от undertaker

Я совсем мимо проходил, но просто интересно - в PHP не принято делать connection pooling?

не принято, т.к. все определяется в основном рамками времени запроса, но хотя можно...

swwwfactory ★★
()
Ответ на: комментарий от undertaker

в PHP не принято делать connection pooling?

Я у себя по старой памяти ещё делаю, но смысла никакого. Как я писал выше, в наше время установление соединения занимает совершенно пренебрежимое время. Разве что будут тысячи ультралёгких запросов к БД на один запрос документа — но это уже указывает на изъян в архитектуре, экономия на коннектах тут — экономия на спичках.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.