У меня есть небольшое приложение php, которое я хочу построить на уровне абстракции db поверх нескольких классов типа «модель».
Я использую ezSQL_mysql для выполнения работы db.
Мой вопрос – лучший способ разработки приложения? Должен ли я использовать шаблон singleton для совместного использования соединения db? Должны ли мои «модельные» классы расширять 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 */ } }
Одноточечное соединение с БД может быть проблематичным. К счастью, для совместного использования соединений нет необходимости. У вас может быть класс диспетчера соединений, который при задании ранее используемого хоста, имени пользователя и базы данных возвращает уже открытое соединение.
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); } }
Здесь не описано, как безопасно хранить учетные данные пользователя. Пароли не должны распространяться во всех сценариях, что может привести вас к этому.
Хорошо для небольшого приложения, определенно используйте шаблон объекта домена. То есть каждый объект представляет собой объект db.
Затем вы можете решить, что погода будет использовать шаблон карты, чтобы добавить более сложные поисковые запросы в db или нет.
Если вы предпочитаете проверенные решения, вы можете проверить Zend_Db. Он охватывает все, что вам нужно, от адаптеров db, фабрики и т. Д. Он в основном реализует шаблон шлюза, но реализация чего-то типа mapper уже показана в справочном руководстве.
Другие растворы будут включать ORM, например Doctrine или Propel.
Образцы не следует злоупотреблять. Если это небольшое приложение, решите проблему как можно проще. Если вы делаете это как эксперимент, попробуйте сыграть с чем-то Доктриной. Те библиотеки иногда могут быть довольно изумительными.
Хорошо … поэтому требования к маленькому приложению росли, как обычно, и я решил пойти с каркасом MVC, вместо того, чтобы сворачивать свой собственный набор классов для управления устойчивым соединением и абстрактного уровня базы данных.
Итак, теперь я использую CodeIgniter http://www.codeigniter.com/, который в основном выполняет то, что я хотел сделать, в более легком для управления способом.
Спасибо за другие ответы.