我正在开发一个支付库,允许我通过同一个界面实现任何支付处理器。我现在面临的问题是,我希望改进提供给处理器的数据的方式。现在它是一个数组,我对这个数组不满意。问题是,如果您事先不知道所有字段,最终会收到通知,或者处理器代码本身需要进行大量检查。我们的想法是能够采用任何类型的数据结构,因为它在应用程序之间有所不同,并使其与处理器一起工作,但也确保处理器获得所需的数据馈送。
我现在的想法是将其更改为对象。该对象将带有所有处理器所需的有限字段集,并且通常具有共同点,但可以扩展该对象以获取其他字段。
这样做的好处是我可以在处理器中验证它是否传递了一个支付对象,它可以验证它是否实现了所有必需的字段,如果没有抛出异常。
现在的问题是,如果这是一个好的方法,还是有更好的失败保存方式,以确保所有处理器都可以依赖传递的数据?
答案 0 :(得分:1)
在您的情况下,我可能会使用类似于以下的架构:
班级payment_data
- >此类将具有所有公共字段并且可能提供一些通用数据验证,您还可以使用特定处理器特定实现将其子类化,其中某些处理器可以接受用于处理器特定逻辑的附加数据。如果无法根据您的验证规则成功构建此对象,则无需将此对象传递给支付处理逻辑。
界面payment_processor
- >此接口将定义任何特定于处理器的实现类需要能够处理基础payment_data
对象的常用方法。
实施payment_processor
的特定于处理器的类 - >这些类都可以处理基本的payment_data
对象,但可以选择性地传递特定于处理器的payment_data
子类,为该处理器实现其他功能。
答案 1 :(得分:1)
我完成了你正在做的事情,我坚持使用数组。数组非常快,可以检查是否缺少任何必需的“字段”。如果数组键是字段名称,请创建所需字段的数组,并使用它来测试是否存在必填字段。
function loadData($data) {
static $rqd_fields = array('field1','field2','field3');
$passed_fields = array_keys($data);
$missing_fields = array_diff($rqd_fields, $passed_fields);
if ( count($missing_fields)>0 ) {
// error, return $missing_fields
} else {
// ok, continue
}
}
答案 2 :(得分:0)
对象是一种好方法;它足够通用,它为您提供了相当大的灵活性。一定要编写一个接口代码,以最大限度地提高灵活性。
当然你如何设计对象很重要......
答案 3 :(得分:0)
你有正确的想法。我建议您使用一个带有__construct的模型,该模型包含您所需的所有元素,并在其他任何地方根据需要注入模型(当然是一个对象)。通过这种方式,您可以非常轻松地在界面中使用各种模型。