Шаблон в целом - это представление о том, как можно решить общую проблему. Они не должны «делать это так» или «все остальное плохо». На самом деле есть даже имя для решения, которое не следует преднамеренно.
Из того, что я видел, люди склонны думать, что «одна таблица БД - это один домен, поэтому каждая таблица БД нуждается в одной модели и одном картографе». В вашем случае, я полагаю, у вас есть три таблицы: пользователи, виджеты и таблица, содержащая отношение n: m между этими двумя (я назову это userwidgets).
Пользовательские виджеты действительно являются частью пользовательской модели и не имеют собственной модели / сопоставителя и являются , а не частью модели виджета. Для разрешения этих идентификаторов виджетов в пользовательской модели, конечно же, нужен механизм отображения виджетов, что приводит к описанной вами проблеме.
Вероятно, есть много способов решить эту проблему, я просто предполагаю, что маппер по умолчанию перезаписывается:
Class UserModel
{
$_widgetMapper = null;
public function getWidgetMapper()
{
if(null === $this->_widgetMapper)
{
$this->setWidgetMapper(new DefaultWidgetMapper());
}
return $this->_widgetMapper();
}
public function setWidgetMapper($mapper)
{
// todo: make sure it's a mapper of the correct type
$this->_widgetMapper = $mapper;
}
}
В случае, если вы не хотите использовать средство отображения виджетов по умолчанию, вы просто должны установить его перед доступом к виджетам пользователя (они должны быть загружены по требованию).