Pergunta

Por exemplo:

Eu tenho um usuário que possui 10 widgets. Junto com isso, tenho um gerente que gerencia 5 desses widgets.

Quero recuperar os widgets do usuário gerenciados por um gerente especificado. Então, criei uma função no meu widgetmapper chamado FetchUsersManagedWidgets ($ userID, $ gerenteID), que consulta o banco de dados para esses 5 widgets e mapeia uma matriz de objetos de widget.

Sei que os objetos de domínio não devem estar cientes de seus mapeadores, mas posso criar uma função no modelo de usuário que chama uma função do widgetmapper?

por exemplo

class Application_Model_User {

    public function getWidgetsManagedBy($manager) {
        $widgetMapper = new Application_Model_WidgetMapper;
        return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
    }

}

Ou essa é uma rua única, e os objetos de domínio nunca devem chamar funções do mapeador?

Foi útil?

Solução

O padrão em geral é uma idéia de como você pode resolver um problema comum. Eles não são um "tem que fazer dessa maneira" ou "tudo o mais é ruim". Na verdade, há até um nome Para uma decissão que não segue padrões intencionais.
Pelo que vi, as pessoas tendem a pensar que "uma mesa de banco de dados é um domínio, de modo que toda mesa de banco de dados precisa de um modelo e um mapeador". No seu caso, suponho que você tenha três tabelas: usuários, widgets e a tabela que mantém a relação n: m entre esses dois (vou chamá -lo de userwidgets).
O userwidgets é realmente parte do modelo de usuário e não possui um modelo/mapeador próprio e é não parte do modelo de widget. Para resolver esses IDs de widgets no Usermodel, o Widget Mapper, é claro, o que resulta no problema que você descreve.
Provavelmente existem muitas maneiras de resolver isso, eu simplesmente presumo que um mapper padrão é complicado:

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;
    }
}

Caso você não queira usar o widget-mapper padrão, basta defini-lo antes de acessar os widgets do usuário (eles devem ser carregados sob demanda).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top