Продолжение этот вопрос — Предположим, у меня есть объект 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, возникает ощущение «неправильности». Действительно ли важно, куда я положил этот метод? Должен ли я создать отдельный «вспомогательный» класс, который будет обрабатывать подобные вещи, несмотря на их явно противоречивую природу?
Договорились — выглядит и чувствует себя неправильно.
Я делаю это так: 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
}
Читать Вот для получения дополнительной информации о шаблоне коллекции. Также возможно эта почта и / или эта почта поможет гид.
Других решений пока нет …