我正在用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函数时延迟加载这些信息。我想我的问题是,实现这一目标的最佳实践是什么?对于使用者而言,信息是特定于用户的域的,所以我认为应该从user类调用它。要实现这一点,域类需要包含自己的映射器实例,但这是否否定了首先拥有服务类的意义?我真的不想每次都这么做。
$recipeCount = $this->_service->getRecipeCount($user);任何想法都将不胜感激。
发布于 2012-02-15 21:06:20
给定一个用户对象,毫无疑问,您可以询问有关该用户的大量问题:获取他的所有群组,获取他的所有帖子,获取他的所有食谱,等等。
人们很容易认为,这些方法中的每一个都必须表示User对象本身的一个方法:
$groups = $user->getGroups();
$posts = $user->getPosts();
$recipes = $user->getRecipes();
// etc在这种情况下,一个类似于Doctrine的ORM (#FTW!)可以帮助管理这些类型的关系,为您提供一种查询语言,您可以使用该语言贪婪地加载或延迟加载用户实体图。
但我认为这里有不同的观点的空间。为什么这些必须是User对象本身的方法?它们可能是服务/存储库类上的方法吗:
$groups = $groupService->getGroupsByUser($user);
$posts = $postService->getPostsbyUser($user);
$recipes = $recipeService->getRecipesByUser($user);
// etc这些服务/存储库类中的每一个都可能使用其自己的映射器类来实例化,以访问其底层数据源。这样就不会在创建/加载User对象时出现懒惰/贪婪的问题。如果您想要获取相关实体,那么可以通过适当的服务/存储库来访问它们,只要您想要它们。
并不是说它应该总是这样或那样。事实上,恰恰相反:这两种方法都有自己的位置。选择在哪种情况下使用哪种方法既涉及对性能的客观分析,也可能涉及到大量的个人美学知识。
只是大声的思考。YMMV.
发布于 2012-02-15 12:59:07
这似乎是一个在Model_DbTable_Users()中定义表关系的地方。这样,您就可以在您认为合适的任何级别上对用户执行findDependentRowset()查询。尽管看起来您可能希望将其放在服务级别。
Table Relationships
https://stackoverflow.com/questions/9287678
复制相似问题