API接口的最佳实践:传递数组或对象以使用?

时间:2012-12-18 00:12:23

标签: php api oop architecture

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

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

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

现在的问题是,如果这是一个好的方法,还是有更好的失败保存方式,以确保所有处理器都可以依赖传递的数据?

4 个答案:

答案 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的模型,该模型包含您所需的所有元素,并在其他任何地方根据需要注入模型(当然是一个对象)。通过这种方式,您可以非常轻松地在界面中使用各种模型。