Включая несколько связанных функций в Data Mapper — есть ли лучшее место?

Продолжение этот вопрос — Предположим, у меня есть объект Project, и я использую объект ProjectMapper для обработки вставки / обновления / удаления, поэтому объект Project не знает о базе данных.

Проект может иметь несколько форм, связанных с ним, поэтому, когда я загружаю страницу, после того, как я обработал заполнение проекта, мне нужно извлечь из базы данных список идентификаторов formID, связанных с проектом, чтобы я мог пройти по нему и создать Формируйте объекты и заполняйте их через объект FormMapper.

Это достаточно простая функция, но я не совсем уверен, куда ее поместить. Поскольку он обращается к базе данных, он не входит в объекты Project или Form. Кажется, что это будет в объекте ProjectMapper, но извлеченные данные не будут отображаться в проект — они будут использоваться при отображении данных в формы.

Основанное на коде представление вышеупомянутого:

$project = new Entity\Project;
$projectMapper = new Mapper\Project($db);

$project->setId(43);
$projectMapper->load($project); //load() will take ID of passed object, fetch data from DB and call setter.

$formIDs = XXXX->getFormIDs($project); //Which object should replace the XXXX?
$formMapper = new Mapper\Form($db);

foreach ($formIDs as $num=>$id) {
$form = new Entity\Form($id)
$formMapper->load($form);
}

Такое чувство, будто я переосмысливаю это, но когда я просто помещаю getFormIDs () в PPRMapper, возникает ощущение «неправильности». Действительно ли важно, куда я положил этот метод? Должен ли я создать отдельный «вспомогательный» класс, который будет обрабатывать подобные вещи, несмотря на их явно противоречивую природу?

1

Решение

Договорились — выглядит и чувствует себя неправильно.

Я делаю это так: Entity\Project имеет метод, называемый setForms, Через какой-либо механизм заполняется метод загрузки вашего картографа Entity\Projectтакже создает новый экземпляр Entity\FormCollection как свойство Entity\Project и вызывает этот экземпляр setProject метод:

Другими словами, ваш маппер проекта выглядит примерно так:

public function load( Entity\Project $project )
{
// map data
// populate $project through some method like $project->setParams( $data )
}

затем Entity\Project«s setParams метод:

public function setParams( $params )
{
// call a bunch of $this->setters to populate instance

// create a FormCollection:
$forms = new Entity\FormCollection;
$forms->setProject( $this )

$this->setForms(  $forms );
}

Чтобы получить формы, связанные с проектом, FormCollection картограф делает работу:

$project->setId( 43 );
$projectMapper->load( $project );

$formCollection = $project->getForms();

$formCollectionMapper = new Mapper\FormCollection( $db );
$formCollectionMapper->load( $formCollection );

// now all your populated form instances can be accessed individually:
// here I use a method `getAssoc()` but you can also create a custom iterator and
// drop the method call
foreach($formCollection->getAssoc() as $form)
{
$form; // instance of Entity\Form
}

Читать Вот для получения дополнительной информации о шаблоне коллекции. Также возможно эта почта и / или эта почта поможет гид.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector