首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend框架模型设计

Zend框架模型设计
EN

Stack Overflow用户
提问于 2012-02-15 11:59:55
回答 2查看 431关注 0票数 3

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

代码语言:javascript
复制
//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());
    }

}

我将在控制器中检索一个用户对象,如下所示

代码语言:javascript
复制
$user = $this->_service->fetch($id);

到目前为止,这个方法运行得很好,但现在我想这样做

代码语言:javascript
复制
$user = $this->_service->fetch($id);
$recipeCount = $user->getRecipeCount();

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

代码语言:javascript
复制
$recipeCount = $this->_service->getRecipeCount($user);

任何想法都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-15 21:06:20

给定一个用户对象,毫无疑问,您可以询问有关该用户的大量问题:获取他的所有群组,获取他的所有帖子,获取他的所有食谱,等等。

人们很容易认为,这些方法中的每一个都必须表示User对象本身的一个方法:

代码语言:javascript
复制
$groups = $user->getGroups();
$posts = $user->getPosts();
$recipes = $user->getRecipes();
// etc

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

但我认为这里有不同的观点的空间。为什么这些必须是User对象本身的方法?它们可能是服务/存储库类上的方法吗:

代码语言:javascript
复制
$groups  = $groupService->getGroupsByUser($user);
$posts   = $postService->getPostsbyUser($user);
$recipes = $recipeService->getRecipesByUser($user);
// etc

这些服务/存储库类中的每一个都可能使用其自己的映射器类来实例化,以访问其底层数据源。这样就不会在创建/加载User对象时出现懒惰/贪婪的问题。如果您想要获取相关实体,那么可以通过适当的服务/存储库来访问它们,只要您想要它们。

并不是说它应该总是这样或那样。事实上,恰恰相反:这两种方法都有自己的位置。选择在哪种情况下使用哪种方法既涉及对性能的客观分析,也可能涉及到大量的个人美学知识。

只是大声的思考。YMMV.

票数 3
EN

Stack Overflow用户

发布于 2012-02-15 12:59:07

这似乎是一个在Model_DbTable_Users()中定义表关系的地方。这样,您就可以在您认为合适的任何级别上对用户执行findDependentRowset()查询。尽管看起来您可能希望将其放在服务级别。

Table Relationships

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9287678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档