Есть подключение к БД:
class Db {
public static function getConnection() {
$paramsPath = ROOT . '/config/db_params.php';
$params = include($paramsPath);
$dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
$db = new PDO($dsn, $params['user'], $params['password']);
$db->exec("set names utf8");
return $db;
}
}
И в каждом классе, в каждом методе я делаю такое:
public static function getCategoriesList() {
$db = Db::getConnection();
$result = $db->query('SELECT id, name FROM category '
. 'ORDER BY sort_order ASC');
.........
}
Как избавитсья вот от этого говнокода? $db = Db::getConnection();
Как можно в индексном файле вызывать подключение и не подключаться каждый раз в каждом методе? Как вариант создать класс подключения и в других классах стучаться в него через конструктор?
Ответ
Просто сохраняйте соединение в статической переменной:
private static $db = null;
public static function getConnection() {
if (!is_null(self::$db)) return self::$db;
// ...
self::$db = ...;
return self::$db;
}
Однако, это способно доставить боль, как только возникнет необходимость во втором соединении.
В вашем случае(статические классы) примерно то же самое можно сделать и в клиентских классах:
class Advt {
private static $db;
public static function setDB(DB $db){self::$db = $db;}
public static function getAdvtList($page = 1) {
//...
self::$db->query(...);
//...
}
}
Advt::setDB(DB::getConnection());
Всё, что ниже - просто моё видение того, как примерно это должно быть.
Лучше хранить соединение в экземпляре DB, и реализовав пару методов для запросов, работать с ним.
В классах, чьё существование без соединения с базой не имеет смысла, можно передать объект базы в конструктор и сохранить в $this->db скажем.
class Db {
private $config;
private $connection;
public function __construct() {
$paramsPath = ROOT . '/config/db_params.php';
$this->config = include($paramsPath);
}
public function connect() {
$dsn = "mysql:host={$this->config['host']};dbname={$this->config['dbname']}";
$this->connection = new PDO($dsn, $this->config['user'], $this->config['password']);
$this->connection->exec("set names utf8");
}
public function query($sql, $params) {
if (!$this->connection) $this->connect();
// prepare/execute
}
public function rows($sql, $params) {
// query/fetch
} // fetch rows
public function row($sql, $params) {} // fetch one row
public function col($sql, $params, $col = 0) {} // fetch column
public function cell($sql, $params, $col = 0) {} // fetch scalar value
}
somecontroller.php
class A {
protected $db;
public function __construct(DB $db) {$this->db = $db;}
public function getUser($id) {
return $this->db->row('SELECT * FROM Users WHERE id = ?', [$id]);
}
}
Комментариев нет:
Отправить комментарий