Правильный дизайн MVC для Symfony / Propel?


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

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

  • весь код, связанный с базой данных, даже логика, связанная с БД, должны входить в модели.
  • для таблицы, скажем 'my_tab', propel генерирует 4 класса, из которых какие только 2 класса ' MyTab.php ' и ' MyTabPeer.php ' должен быть отредактирован.
  • MyTabPeer.php должен иметь только выборку данных.
  • любая логика, если требуется получить данные, должна идти в ' MyTab.php '
Это просто, и я надеюсь, что это правильно, если нет, пожалуйста, поправьте меня. Теперь у меня есть особое условие. У меня есть 4 таблицы, скажем a, b, c, d. для этого propel сгенерировал 8 редактируемых классов (исключая base*.php)
A.php    APeer.php    B.php    BPeer.php
C.php    CPeer.php    D.php    DPeer.php

Одна страница моего приложения, показывает почтовый ящик (скажем). Почтовый ящик не является таблицей в базе данных, но он получает свои данные из сложного запроса соединения между вышеупомянутыми 4 таблицами вместе с большим количеством вычислений / условий.

Я сгенерировал этот запрос, извлек из него данные и отобразил их. Почтовый ящик работает, как и ожидалось. Однако я сделал это в своем контроллере (класс действий), который, как я знаю, не является подходящим местом для этого.

Мой вопрос: , куда я должен поместить этот код? Возможные варианты:

  • контроллер, я думаю, не самое подходящее место для БД логика / извлечение.
  • я классифицировал 8 моделей, однако данные не принадлежат ни к одной из них, а являются их комбинацией.
  • отдельный помощник / lib, но я знаю, что никогда не буду повторно использовать этот код в качестве его уникальной страницы сайта.
  • где-нибудь еще?

Пожалуйста, предложите, если я ошибаюсь, но я думаю, что я должен поместить его в модели, так как он извлекает данные. Поскольку A является первичной таблицей, я, вероятно, должен поместить код в A.php и Апир.РНР. Если это правильное место, следующий вопрос, Что должно войти A.php и что должно идти в Апир.php? Мне нужно выполнить следующие операции:

  • некоторая логика, чтобы решить, какие столбцы я должен выбрать.
  • Как и почтовый ящик, я могу показать полученное / отправленное сообщение. Контроллер скажет, что показать, но есть некоторая логика БД, чтобы установить условия.
  • Затем действительно извлеките данные из сложного запроса соединения.
  • возвращаемые данные будут содержать все строки, но мне может потребоваться объединить несколько строк условно.

Согласно моему пониманию, пункт 3 должен войти Апир.php и отдых внутри A.php. Верно ли мое понимание?

1 2

1 ответ:

Вы должны создать отдельный класс модели, то есть почтовый ящик. Метод этой модели должен делать сложный выбор и возвращать данные к вашему действию в контроллере. Это решение не нарушит подход MVC.