Уровень доступа к данным, лучшие практики - PullRequest
2 голосов
/ 19 мая 2010

Я ищу информацию о лучшем способе рефакторинга слоя доступа к данным (DAL) в моем веб-приложении на основе PHP. Я следую шаблону MVC: PHP / HTML / CSS / и т. Д. представления на внешнем интерфейсе, контроллеры / службы PHP в середине и PHP DAL, расположенный поверх реляционной базы данных в модели. Довольно стандартные вещи. Все работает хорошо, но мой DAL становится большим (codemell?) И становится немного громоздким.

Мой DAL содержит почти всю логику для взаимодействия с моей базой данных и полон функций, которые выглядят так:

function getUser($user_id) {
   $statement = "select id, name from users where user_id=:user_id";
   PDO builds statement and fetchs results as an array
   return $array_of_results_generated_by_PDO_fetch_method;
}

Примечания:

  • Логика в моем контроллере взаимодействует только с моделью, используя функции, подобные описанным выше в DAL
  • Я не использую фреймворк (я из мнение, что PHP является шаблонизатором язык и нет необходимости ввести сложность через каркас)
  • Я обычно использую PHP как процедурный язык и склонны уклоняться от его ООП подход (мне нравится ООП развитие, но предпочитаю сохранить это сложность вне PHP)

Какие подходы вы выбрали, когда ваш DAL достиг этого уровня? У меня есть фундаментальная проблема дизайна? Нужно ли мне просто нарезать свой DAL на несколько файлов меньшего размера (логически разделить его)? Спасибо.

Ответы [ 2 ]

3 голосов
/ 19 мая 2010

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

Если у вас есть каждая таблица в качестве модели, я не буду беспокоиться о количестве кода в каждом классе. Хорошо иметь "толстые модели" и "тощие контроллеры".

Если вы хотите уменьшить объем кода, вы можете использовать облегченную оболочку объекта данных, например, PEAR DB_DataObject . Несколько примеров того, как может выглядеть модель DB_DataObject:


$user = new User;
$user->get($user_id);

$user = new User;
$user->name = 'foo';
$user->find();
while($user->fetch()) {
...
}

Преимущество использования чего-то вроде DB_DataObject заключается в том, что вы абстрагируете множество низкоуровневых PDO, и ваша реализация класса будет больше фокусироваться на вашей бизнес-логике.

1 голос
/ 20 мая 2010

Может быть, немного отвлекся от фактического вопроса, но вас может заинтересовать серия выступлений Тоона Коппелаара (Toon Koppelaars), весьма компетентного руководителя Oracle DB, об архитектуре программного обеспечения, известной (или, я должен сказать, неизвестной) как Хельсинкская декларация ".

См. http://thehelsinkideclaration.blogspot.com/2009/03/helsinki-declaration-observation-1.html

Это касается, возможно, немного в сторону, но в любом случае, сильно, по теме, о которой ваш вопрос на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...