php shared db connection (справка по шаблону проектирования) - PullRequest
2 голосов
/ 22 февраля 2011

У меня есть небольшое php-приложение, для которого я хочу создать слой абстракции db поверх нескольких классов «модельного» типа.

Я использую 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 ]

3 голосов
/ 22 февраля 2011

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

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);
    }
}

Здесь не рассматривается, как безопасно хранить учетные данные пользователя.Пароли не должны распространяться волей-неволей по всем сценариям, что может привести вас к этому подходу.

2 голосов
/ 22 февраля 2011

Хорошо для небольших приложений, обязательно используйте шаблон объекта предметной области. То есть каждый объект представляет сущность БД.

Тогда вы можете решить, будете ли вы использовать шаблон сопоставления для добавления более сложных поисков в БД или нет.

Если вы предпочитаете проверенные решения, вы можете проверить Zend_Db. Он охватывает все, что вам нужно, от адаптеров БД, фабрики и т. Д. Он в основном реализует шаблон шлюза, но реализация чего-то вроде mapper уже показана в справочном руководстве.

Другие солютоны включают ORM, например Doctrine или Propel.

Шаблоны не должны быть чрезмерно использованы. Если это небольшое приложение, решите проблему как можно проще. Если вы делаете это в качестве эксперимента, попробуйте поиграть с чем-нибудь Doctrine. Эти библиотеки иногда могут быть довольно удивительными.

0 голосов
/ 23 февраля 2011

Хорошо ... поэтому требования к небольшому приложению, как обычно, выросли, и я решил использовать MVC-фреймворк, а не использовать свой собственный свободный набор классов для управления постоянным соединением и абстрагирования уровня базы данных.

Так что теперь я использую CodeIgniter http://www.codeigniter.com/, который в основном выполняет то, что я хотел сделать, проще в управлении.

Спасибо за другие ответы.

...