Взялся в учебных целях написать простую реализацию паттерна Active Record, получился
вот такой сервис. Собственно вопрос прост - правильно ли я всё делаю?
Итак, вот что я сделал.
Работу с базой инкапсулирует синглтон-класс DB. Он подключается к базе:
private function __construct() {
$this->connect = new mysqli(self::HN, self::UN, self::PW, self::DB);
$this->connect->query('SET NAMES utf8');
mb_internal_encoding("UTF-8");
if ($this->connect->connect_error) {
die($conn->connect_error);
}
}
и возвращает объект подключения:
public static function getConnection() {
if (empty(static::$instance)) {
static::$instance = new static();
}
return static::$instance->connect;
}
Данные конкретной книги обслуживает класс Book. Он возвращает свойства, необходимые для отображения характеристик книги, а также обновляет их, обращаясь для этого к классу BookManager:
public function update(array $data) {
$result = BookManager::update($this->id, $data);
$this->author = $result['author'];
$this->title = $result['title'];
$this->pages = $result['pages'];
$this->price = $result['price'];
}
Класс BookManager, собственно, реализует Active Record. В нём хранятся запросы, необходимые для работы с базой:
private static $selectString = "SELECT * FROM books WHERE id = ?";
private static $multipleSelectString = "SELECT * FROM books ORDER BY id LIMIT ?, ?";
private static $updateString = "UPDATE books SET author = ?, title = ?, pages = ?, price = ? WHERE id = ?";
private static $insertString = "INSERT INTO books (author, title, pages, price) VALUES (?, ?, ?, ?)";
private static $countString = "SELECT COUNT(*) FROM books";
И методы для работы с этими запросами. Метод getBook находит данные книги по представленному id и возвращает соответствующий объект класса Book:
static public function getBook($id) {
$resultSet = static::getData($id);
return new Book(
$resultSet['id'],
$resultSet['author'],
$resultSet['title'],
$resultSet['pages'],
$resultSet['price']
);
}
static private function getData($id) {
global $db;
$stmt = $db->prepare(self::$selectString);
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$resultSet = $result->fetch_assoc();
return $resultSet;
}
Метод getCount возвращает общее количество книг в таблице:
static public function getCount() {
global $db;
$stmt = $db->prepare(self::$countString);
$stmt->execute();
$stmt->bind_result($count);
$stmt->fetch();
return $count;
}
Метод update обновляет данные в таблице:
static public function update($id, array $data) {
global $db;
$stmt = $db->prepare(self::$updateString);
$stmt->bind_param('ssiii',
$data['author'],
$data['title'],
$data['pages'],
$data['price'],
$id
);
$stmt->execute();
$resultSet = static::getData($id);
return $resultSet;
}
Ну и так далее.
Спасибо всем, кто откликнется.