我想在PHP中构建一个小型ORM (对象关系映射)框架。我想混合使用MVC方法,与CodeIgniter使用的控制器/方法/变量方法相同。
已经有一些框架可以做到这一点,但类似的情况如下
在这些框架中很难做到。我的主要目标是尽可能多地使用干原理,而不是用对象来完成整个系统的功能。这主要意味着用于表单验证和CRUD等的重复代码非常少。
我想了解如何组织这样的框架,架构是什么,以及如何处理一个典型的请求,比如注册表单,以及如何验证它,由这个框架来处理。
请分享你的想法/想法。这将作为一个开放源码框架发布,免费,当它完成。
发布于 2009-02-28 18:36:16
我可能会建议,与其围绕表单()构建验证规则,不如在域对象中构建验证。然后将表单数据直接提交到域对象以进行验证。我使用的是Zend框架,但是我使用这个基本结构来满足我的验证需求:
/**
* 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的上下文助手,然后根据该上下文专门处理它。
发布于 2009-02-28 17:46:04
有许多很好的开源框架,它们比从头开始编写开源框架更容易、更快地完成您所期望的任务!话虽如此,我开发了一个MVC框架,它教会了我很多关于框架开发和面向对象设计的知识。如果您有大量的时间并且希望将其作为一个学习实验(可能以一个相当好的框架结束),则建议您这样做。
至于你关于ORM框架的想法..。我想可能对ORM是什么有一些混淆。ORM是一种将对象映射到关系数据库、处理数据检索和存储的技术。它通常是更大框架中的一个组件,不一定是框架本身的特征。大多数人对MVC框架不屑一顾,因为可以构建应用程序的基本模型-视图-控制器架构。
一些PHP框架提供了更多的开箱即用的功能,比如您感兴趣的功能。
因此,在这个问题上还有其他的线索,但是我想说,如果您有时间并想学习的话,构建您自己的框架。如果您想要在最短的时间内尽可能轻松地完成某件事情,请使用许多现有框架中的一个。
发布于 2009-03-10 15:49:50
gabriel1836的文章很棒,但是您可以使用的一种简洁的技术是马修·威尔·奥芬尼,他展示了一种将表单“附加”到模型并将其用于输入、过滤和验证的技术。非常特定的ZF,但可能会派上用场。
https://stackoverflow.com/questions/598332
复制相似问题