Zend框架模型设计

我正在Zend Framework中构建一个应用程序。 我的模型由三个层组成,域类,数据映射器类和为所有外部通信提供接口的服务层。 目前,数据映射器类仅用于我的服务层,而域类是仅包含特定于其域的信息的简单php对象。 我的意思是一个非常粗略的例子....

//domain class
public class User{
   // data and functions specific to the user domain
}

//service class
public class UserService{
    // service contains an instance of the mapper class
    protected $_mapper = 

    public function fetch($id){
        return $this->_mapper->find($id);
    }
} 

//mapper class
public class UserMapper{
    protected $_dbTable = new Zend_Db_Table('user');

    public function find(){
        return new User($this->_dbTable->find($id)->current());
    }

}

我会像这样在控制器中检索用户对象

$user = $this->_service->fetch($id);

到目前为止,这工作得很好,但现在我想这样做

$user = $this->_service->fetch($id);
$recipeCount = $user->getRecipeCount();

新数据来自另一个表,并且我不想在每次加载用户时从数据库中提取所有这些信息,我希望在调用getRecipeCount函数时延迟加载该信息。 我想我的问题是实现这个目标的最佳做法是什么? 就消费者而言,这些信息是特定于用户领域的,所以我认为它应该从用户类中调用。 为了实现这个目标,域类需要包含它自己的映射器实例,但是否定了服务类放在首位呢? 我真的不想每次都这样做。

$recipeCount = $this->_service->getRecipeCount($user);

任何想法将不胜感激


给定一个用户对象,毫无疑问,你可以询问关于这个用户的大量东西:获取他的所有组,获得他的所有帖子,获得他的所有配方等。

很容易认为每一个都必须代表User对象本身的一个方法:

$groups = $user->getGroups();
$posts = $user->getPosts();
$recipes = $user->getRecipes();
// etc

在这种情况下,像Doctrine(#FTW!)这样的ORM可以帮助管理这些类型的关系,为您提供一种查询语言,您可以用它来贪婪加载或延迟加载用户实体图。

但我认为这里有不同的看法。 为什么这些必须是用户对象本身的方法? 他们可以改为服务/存储库类的方法:

$groups  = $groupService->getGroupsByUser($user);
$posts   = $postService->getPostsbyUser($user);
$recipes = $recipeService->getRecipesByUser($user);
// etc

这些服务/存储库类中的每一个都可能使用自己的映射器类来实例化,以访问其基础数据源。 通过这种方式,在创建/加载User对象时没有懒/贪心的问题。 如果你想获得相关的实体,那么请继续通过相应的服务/存储库访问它们,恰好当你想要它们时。

不要说它应该永远是这样或那样。 事实上,恰恰相反:两种方法都有它们的位置。 选择在哪种情况下使用哪一种方法,既涉及对性能的客观分析,也可能涉及个人美学方面的少量问题。

只是大声思考。 因人而异。


这看起来像是一个在Model_DbTable_Users()定义表关系的地方。 这样你就可以在任何你认为合适的级别上对用户执行findDependentRowset()查询。 尽管看起来你可能想把它放在服务级别上。

表关系

链接地址: http://www.djcxy.com/p/56231.html

上一篇: Zend Framework Model Design

下一篇: zend mapping one to many fetchall