首页 / PHP / php-Zend框架模型设计
php-Zend框架模型设计
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php-Zend框架模型设计,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2270字,纯文字阅读大概需要4分钟。
内容图文
![php-Zend框架模型设计](/upload/InfoBanner/zyjiaocheng/655/6e03478dc80547d4a99860369892cd9f.jpg)
我正在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类中调用它.为了实现这一点,域类将需要包含其自己的mapper实例,但这是否就否定了将服务类放在首位的意义呢?我真的不想每次都这样做.
$recipeCount = $this->_service->getRecipeCount($user);
任何想法将不胜感激
解决方法:
给定一个User对象,毫无疑问,您可以向该用户询问很多东西:获取他的所有群组,获取他的所有帖子,获取他的所有食谱等.
诱人的是,这些元素必须代表User对象本身的方法:
$groups = $user->getGroups();
$posts = $user->getPosts();
$recipes = $user->getRecipes();
// etc
在这种情况下,像Doctrine(#FTW!)这样的ORM可以帮助管理这些类型的关系,为您提供一种查询语言,您可以用它贪婪地加载或延迟加载用户实体图.
但是我认为这里有空间可以提出不同的看法.为什么这些必须是User对象本身的方法?相反,它们可以是服务/存储库类上的方法:
$groups = $groupService->getGroupsByUser($user);
$posts = $postService->getPostsbyUser($user);
$recipes = $recipeService->getRecipesByUser($user);
// etc
这些服务/存储库类中的每一个都可能使用其自己的映射器类实例化,以访问其基础数据源.这样,在创建/加载User对象时就不会出现懒惰/贪婪的问题.如果要获取相关实体,则可以在适当的时候,通过适当的服务/存储库继续访问它们.
不要说这应该总是一种方法.实际上,恰恰相反,这两种方法都有自己的位置.选择在哪种情况下使用哪个需要对性能进行客观分析,并且可能涉及少量个人美学.
只是大声思考. YMMV.
内容总结
以上是互联网集市为您收集整理的php-Zend框架模型设计全部内容,希望文章能够帮你解决php-Zend框架模型设计所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。