Мне записали приложение MVC с Платформой Зенда, которая вытягивает данные из базы данных Oracle 10g и отображает эти данные в Таблицах и Списках и визуально обогащает эти данные через цвета и диаграммы. Нет никакого ORM, и не Создайте, Обновление или Удалите включенный, просто чистое Чтение. Данные вставляются из другого приложения. Данные в DB смоделированы после понятий они представляют и получили доступ Представлениями DB, что агрегат эти данные из различных других таблиц (наследие, не может измениться), например.
| Event ID | Start | End | Status | Created_By |
-----------------------------------------------------------------------------
| 12345678 | 2009-10-01 12:00:00 | 2009-10-01 12:15:00 | booked | John Doe |
| 12345679 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | booked | John Doe |
| 12345680 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | tba | Jane Doe |
Пользователи могут влиять на отображение столбца, заказывая и сортируя от Представления. Клиенты могут отклонить/позволить доступ к столбцам и ограничить содержимое столбца определенными значениями. Пользователи не могут переопределить клиентские настройки. Пользователь является агентом, в то время как клиент является в основном просто фильтром, который создает подмножество доступных данных пользователю, принадлежащему клиенту. Настройки User и Client сохраняются.
Мой текущий подход работает примерно как это:
Request --> Controller
| <--> sanitizes and returns Request params
| ---> Facade (capsules steps to fetch View Data)
| | <--> Table Data Gateway builds Query for requested View
| | <--> Query Decorator¹ applies User/Client settings
| | <--> DB Adapter fetches RecordSet from decorated Query
| <----returns Recordset
| <--> applies RecordSet to View
| <--> Data-Aware ViewHelper render RecordSet (and View)
Response <--returns rendered View
¹
Декоратор Запроса может читать в сохраненных настройках User/Client и добавить его к основному объекту Запроса, возвращенному TDG на лету.
Однако в последнее время я сомневался относительно этого подхода и хочу улучшить его. Я предполагаю, что мог удалить TDGs полностью и сделать Представление, создающее полностью универсальный из UI; на основе одной только структуры DB. Пользователи, конечно, хотели бы это. Вещь, Представление должно знать много о данных. ViewHelpers должны знать имена столбцов для обогащения данных, и часто они делают так в отношении нескольких столбцов в Recordsets. Они не могут быть универсальными, и что-то мне подсказывает, что это - проблема так или иначе. Похоже на путаницу. Я просто не могу точно определить почему.
Любые шаблоны, идеи - и мнения - значительно ценятся. Я знаю, что вопрос несколько неопределенен, но как я сказал, я не могу точно определить то, что заставляет меня сомневаться относительно этого подхода. Таким образом, я предполагаю, что ищу любые хорошие подходы практики к созданию пользователя и клиента настраиваемые ориентированные на базы данных приложения удобным в сопровождении способом. Мне, конечно, не нужно решение, просто некоторые идеи и возможно несколько ссылок, чтобы видеть, как другие люди приближаются к этой проблеме, таким образом, я могу принять ее во внимание на следующем рефакторинге.
Примечание:
Я оставлю вопрос открытым на полное время прежде, чем принять ответ. Любой вход ценится.
Перечитав свой вопрос несколько раз и немного поразмыслив над ним, Я считаю, что резюмирую ситуацию следующим образом:
Буква «M» отсутствует в вашем «MVC».
На этом этапе вы вручную создали схему реляционной базы данных так, чтобы она отображалась 1: 1 с вашей моделью предметной области. И это здорово, это упрощает отображение, но набор записей по-прежнему не является предметным классом.
Термин Модель в контексте MVC относится к модели предметной области , а не к реляционной модели . Если у вас есть реляционная база данных, поддерживающая это приложение, вам нужно какое-то сопоставление. Это не значит, что вам нужна полноценная структура ORM, такая как Doctrine - хотя я считаю, что эти инструменты значительно облегчают мою жизнь даже для небольших проектов - но вам нужно что-то . Фактически, Zend Framework даже подробно описывает отображение модели предметной области в Quick Start .
Я не думаю, что вам нужно удалять TDG. Абстракции хороши. Вырезание его, чтобы сделать ваше приложение немного более компактным, - это то, что я бы сравнил с входом в офисное здание и разрывом телефонной системы на том основании, что сотрудники могут просто использовать свои сотовые телефоны. Они могут , но вы не хотите, чтобы они , точно так же, как вы не хотите, чтобы ваши представления бросали SQL-запросы непосредственно в базу данных. Это неэффективно и, как правило, сложно управлять.
Моя версия архитектуры будет выглядеть так:
Request --> Controller
| <--> sanitizes and returns Request params
| ---> Facade (encapsulates steps to fetch View Data)
| | <--> Table Data Gateway builds Query for requested View
| | <--> Query Decorator applies User/Client settings
| | <--> DB Adapter fetches RecordSet from decorated Query
*** | | <--> Mapping layer converts RecordSet to Domain Model
*** | <----returns Model
*** | <--> applies Model to View
*** | <--> Data-Aware ViewHelper render Model (and View)
Response <--returns rendered View
Я пометил строки изменений ***
. На самом деле, единственное, что я изменил, это то, что вместо того, чтобы брать набор записей с фасада, он выбирает модель (вероятно, массив классов предметной области) и применяет , что к View.
Вместо таких терминов, как $ row ['Status']
в вашем представлении [Helper], у вас будет $ event-> status
, что безопаснее и проще в обслуживании. в долгосрочной перспективе. Там нет имени столбца, только свойство.
Теперь вы прямо упомянули в самом начале своего вопроса, что у вас нет ORM, поэтому я думаю, что вы, вероятно, знаете о большей части этого и, возможно, вам просто нужно подтолкнуть.Эти мучительные сомнения в вашей голове, вероятно, примерно такие: Что, если он не всегда доступен только для чтения? Что, если модель данных станет более сложной? Что, если люди начнут запрашивать более сложные отчеты?
Все это является причиной того, почему у вас есть модель предметной области, почему она фактически является фундаментальным строительным блоком MVC: в конце концов, ментальная модель ваших пользователей будет не синхронизируются с моделью данных по ряду причин, которые я здесь не буду вдаваться. Дело в том, что это происходит почти всегда.
Я уверен, что это необходимо? Уверен ли я, что это не просто излишество, куча ритуальных заклинаний, которые не имеют значения для такого маленького проекта?
Нет, нет. Только вы можете это решить. Я могу сказать вам, что парадигма MVC как специфическая архитектура не принесет вам много пользы без правильной модели предметной области. Это немного лучше, но не , что намного лучше, чем просто встроенные запросы или вызовы фасадов на каждой странице. Без модели MVC - не более чем модная схема перезаписи URL.
Может быть, вам нужен этот уровень абстракции, а может, и нет; но я предполагаю, что вы, вероятно, подозреваете, что могли бы, иначе вы бы не задавали вопрос. Подумайте об этом, проанализируйте текущие требования и объем, спросите себя, какие изменения вероятны, и если текущая архитектура кажется слишком хрупкой для этого, то следующим логическим шагом будет модель предметной области - даже если сегодня это просто точное зеркало реляционной модели. Завтра этого может и не быть.
Надеюсь, что это именно тот ответ, который вы искали!
Схема БД имеет различные требования (производительность запроса/записи, масштабируемость), как к приятному интерфейсу (хороший поток страниц, поддерживающий работу людей или то, как работают процессы). Поэтому довольно часто трудно напрямую отобразить подход к БД и пользовательскому интерфейсу.
В качестве плохого примера я помню приложение, использующее "Oracle Forms", которое непосредственно представляло общий вид из структуры БД. Для нетехнических людей оно часто было очень контр-интуитивно понятным в использовании.
Тем не менее, я думаю, что в вашем случае, если вид может быть непосредственно отображен на схеме БД, обязательно избавьтесь от ненужных абстрактно-слоёв, кода и упростите систему. Реализуйте требования как можно проще.