Pregunta

Por ejemplo:

Tengo un usuario que tiene 10 widgets. Junto con eso tengo un administrador que gestiona 5 de los widgets.

Quiero recuperar los widgets de usuario gestionada por un administrador especificado. Así que creé una función en mi WidgetMapper llama fetchUsersManagedWidgets ($ ID de usuario, $ ManagerID) que consulta la base de datos para los widgets de 5 y asigna un conjunto de objetos Widget.

Sé que no se supone que los objetos de dominio a ser conscientes de sus creadores de mapas, pero puedo crear una función en el modelo de usuario que llama a una función de la WidgetMapper?

por ejemplo.

class Application_Model_User {

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

}

O se trata de una calle de sentido, y objetos de dominio nunca debe llamar a las funciones del asignador?

¿Fue útil?

Solución

Patrón, en general, son una idea de cómo se puede resolver un problema común. Su no es ni una "tienen que hacerlo de esa manera" o "todo lo demás es malo". De hecho hay incluso un nombre para un decission no seguir patrones intencionales.
Por lo que he visto a la gente tiende a pensar que "uno db-tabla es un dominio de modo que cada db-mesa necesita un modelo y un mapeador". En su caso, supongo que tiene tres tablas: usuarios, widgets y la mesa de la celebración de la n:. M relación entre los dos (lo llamaré userwidgets)
Los userwidgets es realmente parte de la facilidad de modelo y no tener un modelo propio / mapeador y es no parte del modelo de widgets. Para resolver esos identificadores de Widget en los UserModel necesitan el asignador widget de, por supuesto, lo que resulta en el problema que se describe.
Probablemente hay mucho de la manera de resolver esto, yo simplemente asumir un defecto mapeador que es overwritable:

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

En caso de que no desee utilizar el widget mapeador predeterminada que simplemente debe configurarlo antes de acceder a los widgets del usuario (que deberían cargarse a la vista).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top