2

我正在开发一个支付库,它允许我通过相同的接口实现任何支付处理器。我现在遇到的问题是我想改进向处理器提供数据的方式。现在它是一个数组,我对那个数组不满意。问题是,如果您事先不知道所有字段,您最终会收到通知,或者处理器代码本身将需要大量检查。这个想法是能够采用任何类型的数据结构,因为它在应用程序之间有所不同,并使其与处理器一起工作,同时确保处理器获得所需的数据馈送。

我现在的想法是将其更改为对象。该对象将带有一组有限的字段,所有处理器都需要并且通常具有共同点,但可以扩展该对象以获取其他字段。

这样做的好处是我可以在处理器中验证它是否传递了一个支付对象,并且它可以验证它是否实现了所有必需的字段,如果没有抛出异常。

所以现在的问题是,这是否是一种好方法,或者是否有更好的失败保存方法来确保所有处理器都可以依赖传递的数据?

4

4 回答 4

1

在您的情况下,我可能会使用类似于以下的架构:

payment_data-> 此类将具有所有通用字段并可能提供一些通用数据验证,您还可以使用特定处理器特定实现对其进行子类化,其中某些处理器可以接受特定处理器逻辑的附加数据。如果无法根据您的验证规则成功构造此对象,则甚至无需将此对象传递给支付处理逻辑。

接口payment_processor-> 此接口将定义任何特定于处理器的实现类都需要能够处理基础payment_data对象的通用方法。

特定于处理器的类实现payment_processor-> 这些类都能够处理一个基本payment_data对象,但可以选择传递一个特定于处理器的子类,该子类payment_data实现该处理器的附加功能。

于 2012-12-18T00:20:55.980 回答
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
     }
 }
于 2012-12-18T00:22:07.027 回答
0

一个对象是一个好方法;它足够通用,可以为您提供相当多的灵活性。一定要对接口进行编码,以最大限度地提高灵活性。

当然,您如何设计对象很重要...

于 2012-12-18T00:15:05.540 回答
0

你有正确的想法。我建议您使用具有 __construct 的所有所需元素的模型,并根据需要在其他任何地方注入模型(这当然是一个对象)。通过这种方式,您可以非常轻松地在界面中使用各种模型。

于 2012-12-18T00:18:09.067 回答