首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何构造PHP中的ORM框架?

如何构造PHP中的ORM框架?
EN

Stack Overflow用户
提问于 2009-02-28 17:16:28
回答 6查看 1K关注 0票数 2

我想在PHP中构建一个小型ORM (对象关系映射)框架。我想混合使用MVC方法,与CodeIgniter使用的控制器/方法/变量方法相同。

已经有一些框架可以做到这一点,但类似的情况如下

  • 表单验证
  • 分页
  • CRUD
  • 和AJAX

在这些框架中很难做到。我的主要目标是尽可能多地使用干原理,而不是用对象来完成整个系统的功能。这主要意味着用于表单验证和CRUD等的重复代码非常少。

我想了解如何组织这样的框架,架构是什么,以及如何处理一个典型的请求,比如注册表单,以及如何验证它,由这个框架来处理。

请分享你的想法/想法。这将作为一个开放源码框架发布,免费,当它完成。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-02-28 18:36:16

我可能会建议,与其围绕表单()构建验证规则,不如在域对象中构建验证。然后将表单数据直接提交到域对象以进行验证。我使用的是Zend框架,但是我使用这个基本结构来满足我的验证需求:

代码语言:javascript
复制
/**
 * Contains the domain object properties.
 * @var array
 */
protected $_data = null;

/**
 * @var array
 */
protected $_filters = null;

/**
 * @var array
 */
protected $_validators = null;

public function validate($data = null)
{
    if(!$data) {
        $data = (array) $this->_data;
    } else {
        $data = array_merge((array) $this->_data, $data);
    }

    $this->_input = new Zend_Filter_Input($this->_filters, $this->_validators, $data, $options);
    $this->_input->addValidatorPrefixPath('LP_Validate_', 'LP/Validate/');
    $this->_input->addFilterPrefixPath('LP_Filter_', 'LP/Filter/');

    if($this->_input->isValid()) {
        $this->_data = (object) $this->_input->getEscaped();
        return true;
    } else {
        $this->_data = (object) $data;
        return false;
    }
}

我目前使用的验证方法的一些限制是,我不能对对象属性调用任何必要的自定义设置程序,而且在运行验证函数之后,我需要想出一种方法来保持对象的原始数据可用。但除此之外,到目前为止,它一直运作良好。

就CRUD而言,答案在一定程度上取决于您想要解决的问题的复杂性,部分取决于您熟悉和做/不喜欢和不想尝试实现的模式。

显然,要实现的最健壮的设计是使用数据映射器( Data ),将单独的域对象放在顶部。但是,在大多数情况下,这是过火的,所以您可以只使用大量(不恰当)被恶意的活动记录模式。这基本上就是CodeIgniter和Zend所提供的功能。

最后,我不得不构建一个使用Data模式的自定义ORM层,因为我需要在我的设计中处理继承映射的情况,而且它的工作非常灵活,但我确实后悔失去了Zend Framework中的Table和Row Gateway实现附带的元数据映射功能。(如果您能够找到一种使用数据映射器有效地创建元数据映射的方法,我希望您向我展示您是如何做到的。*P)。即使您正在尝试构建您自己的PHP代码,您也可以考虑使用,因为它有一些我见过的最好的PHP代码,并且非常接近于标准设计模式。

在分页类中最好看到的一件事是,能够直接绑定到数据库对象,这样就可以根据页面应该显示的值范围将限制子句应用于查询。否则,分页的关键组件是跟踪当前页、每页要显示的记录数以及包含要迭代的值的某种类型的集合对象。

不过,至少要确保不预先加载整个集合,然后只显示一定范围的记录,因为这将带来巨大的性能损失。

就Ajax请求而言,我建议在某种类型的上下文帮助器中构建一个可以检查HTTP请求是否为XHR的上下文助手,然后根据该上下文专门处理它。

票数 3
EN

Stack Overflow用户

发布于 2009-02-28 17:46:04

有许多很好的开源框架,它们比从头开始编写开源框架更容易、更快地完成您所期望的任务!话虽如此,我开发了一个MVC框架,它教会了我很多关于框架开发和面向对象设计的知识。如果您有大量的时间并且希望将其作为一个学习实验(可能以一个相当好的框架结束),则建议您这样做。

至于你关于ORM框架的想法..。我想可能对ORM是什么有一些混淆。ORM是一种将对象映射到关系数据库、处理数据检索和存储的技术。它通常是更大框架中的一个组件,不一定是框架本身的特征。大多数人对MVC框架不屑一顾,因为可以构建应用程序的基本模型-视图-控制器架构。

一些PHP框架提供了更多的开箱即用的功能,比如您感兴趣的功能。

因此,在这个问题上还有其他的线索,但是我想说,如果您有时间并想学习的话,构建您自己的框架。如果您想要在最短的时间内尽可能轻松地完成某件事情,请使用许多现有框架中的一个。

票数 2
EN

Stack Overflow用户

发布于 2009-03-10 15:49:50

gabriel1836的文章很棒,但是您可以使用的一种简洁的技术是马修·威尔·奥芬尼,他展示了一种将表单“附加”到模型并将其用于输入、过滤和验证的技术。非常特定的ZF,但可能会派上用场。

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

https://stackoverflow.com/questions/598332

复制
相关文章

相似问题

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