我可能会建议,与其围绕表单(ala Zend Framework)构建验证规则,不如在域对象中构建验证。然后将表单数据直接提交给域对象进行验证。我正在使用 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 而言,答案部分取决于您要解决的问题的复杂性,部分取决于您熟悉和喜欢/不喜欢和喜欢/不想做的模式尝试实施。
显然,要实现的最健壮的设计是使用数据映射器和位于顶部的单独域对象。但是,在大多数情况下,这太过分了,因此您可以只使用受到很大(不恰当)诽谤的 Active Record 模式。这基本上是 CodeIgniter 和 Zend Framework 用他们提供的东西所做的。
我最终不得不构建一个使用数据映射器模式的自定义 ORM 层,因为我需要在我的设计中处理继承映射的情况,而且它的工作非常流畅,但我很遗憾失去了表附带的元数据映射功能Zend 框架中的行网关实现。 (如果您能找到一种使用数据映射器有效地创建元数据映射的方法,我希望您向我展示您是如何做到的。:P)。即使您正在尝试构建自己的框架,您也可以考虑查看 Zend 框架,因为它包含一些我见过的最好的 PHP 代码,并且非常遵循标准设计模式。
在分页类中很高兴看到的一件事是能够直接绑定到数据库对象,从而可以根据页面应显示的值范围将限制子句应用于查询.否则,分页的关键组件是跟踪当前页面、每页显示的记录数以及包含要迭代的值的某种集合对象。
不过,您至少要确保不要预加载整个集合,然后只显示特定范围的记录,因为这会对性能造成巨大影响。
就 Ajax 请求而言,我建议构建某种上下文帮助器,它可以检查 HTTP 请求是否是 XHR,然后根据该上下文专门处理它。