php shared db connection (справка по шаблону проектирования)
У меня есть небольшое php-приложение, которое я хочу создать слой абстракции БД поверх нескольких классовых моделей.
Я использую ezSQL_mysql для работы с БД.
У меня вопрос, как лучше всего разработать приложение? Должен ли я использовать шаблон синглтона, чтобы разделить соединение БД? Должны ли мои "модельные" классы расширять ezSQL_mysql? Или, может быть, я здесь совсем не в порядке и мне нужно заняться чем-то другим.
Мне нужно что-то вроде этого
controller.php
$db = new ezSQL_mysql($db_user, $db_passwd, $db_database, $db_host);
$user = new User();
$user->update_email($new_email);
$sale = new Sale();
$sale->purchase($amount);
User_model.php
class User {
/* uses $db connection */
function update_email(){
/* do something */
};
}
Sale_model.php
class Sale {
/* uses $db connection*/
function purchase () {
/* do something */
}
}
3 ответа
Хорошо... так что требования к небольшому приложению, как обычно, выросли, и я решил использовать MVC-фреймворк, а не использовать свой собственный свободный набор классов для управления постоянным соединением и абстрагирования уровня базы данных.
Так что теперь я использую CodeIgniter http://www.codeigniter.com/ который в основном выполняет то, что я хотел сделать, проще в управлении.
Спасибо за другие ответы.
Синглтон соединения с БД может быть проблематичным. К счастью, это не обязательно для совместного использования соединения. У вас может быть класс диспетчера подключений, который, когда ему дано ранее использованное имя хоста, пользователя и базы данных, возвращает уже открытое соединение.
abstract class ConnectionManager {
protected $connections = array();
function connect($host, $db, $user, $pw) {
if (! isset($this->connections[$host][$db][$user])) {
$this->connections[$host][$db][$user] = $this->newConnection($host, $db, $user, $pw));
}
}
abstract protected function newConnection($host, $db, $user, $pw);
}
class EzSQLConnectionManager extends ConnectionManager {
protected function newConnection($host, $db, $user, $pw) {
return new ezSQL_mysql($user, $passwd, $database, $host);
}
}
Здесь не рассматривается, как безопасно хранить учетные данные пользователя. Пароли не должны распространяться волей-неволей по всем сценариям, что может привести вас к этому подходу.
Хорошо для небольшого приложения, определенно используйте шаблон объекта предметной области. То есть каждый объект представляет сущность БД.
Затем вы можете решить, будете ли вы использовать шаблон маппера, чтобы добавить более сложные поиски в БД или нет.
Если вы предпочитаете проверенные решения, вы можете проверить Zend_Db. Он охватывает все, что вам нужно, от db-адаптеров, фабрики и т. Д. Он в основном реализует шаблон шлюза, но реализация чего-то вроде mapper уже показана в справочном руководстве.
Другие солютоны включают ORM, такие как Doctrine или Propel.
Шаблоны не должны быть чрезмерно использованы. Если это маленькое приложение, решите проблему как можно проще. Если вы делаете это в качестве эксперимента, попробуйте поиграть с чем-нибудь Doctrine. Эти библиотеки иногда могут быть довольно удивительными.