Php 模板方法模式是共享Soap方法的最佳解决方案吗?

Php 模板方法模式是共享Soap方法的最佳解决方案吗?,php,zend-framework,design-patterns,soap,Php,Zend Framework,Design Patterns,Soap,我有许多Soap服务器类,其中大多数需要实现3种方法: ping() // something to bounce a signal off to prove it has been reached getCredentials($creds) // credentials to check sets session value getCaller() // for logging, uses session value 因为它们是WSDL定义的一部分,所以它们需要是公共的 我相当肯定这个(我

我有许多Soap服务器类,其中大多数需要实现3种方法:

ping() // something to bounce a signal off to prove it has been reached
getCredentials($creds) // credentials to check sets session value
getCaller() // for logging, uses session value
因为它们是WSDL定义的一部分,所以它们需要是公共的

我相当肯定这个(我把它命名为Soaplogin)需要是一个抽象类(因为它永远不能单独实例化)

扩展这个核心的具体类有自己的方法,没有一个是共享的

我正在搜索要使用的最佳模式类型,并且有点困惑,尽管我认为模板方法非常适合,但我可以简单地扩展SoapLogin类

你能给我什么样的建议来使用最好的模式,也许是这个类的首选名称


(虽然这使用了ZF1组件,但它没有使用完整的MVC(如果这很重要)

如果您只想创建几个soap连接,那么这种模式可能是一个很好的解决方案

另一种可能是使用接口。它将告诉您的程序,实现SoapItf的每个类(例如,如果您愿意,可以重命名它)都能够执行soap方法

如果您寻找一个演进型应用程序,可能需要在之后连接Rest webservice,这样您就可以创建一个抽象类Werbservice,两个类Soap和Rest来扩展它,这两个类分别实现接口SoapItf和RestItf

这种方法有助于使用多态性,多态性是OOP中的一个重要概念

在这种情况下,我可以将方法添加到Soap或Rest中,而不必同时更改两者


之后,如果您像示例中那样对Soap有特殊性,则可以扩展Soap类。开发应用程序和使用包体系结构将更容易(如果您使用名称空间,这将很有趣)

更喜欢组合而不是继承

您真正要做的是创建完全独立的接口,这些接口碰巧具有相同的方法

好的。总是做同样事情的泛型方法——应该在它自己的类中。但不是所有这些方法都有一个类!每个方法一个类

然后,您可以将所有这些方法类添加到服务器类中,还可以以相同的方式添加所有特殊函数


这样,您可以以任何方式组合任何通用函数,并在需要时仅向一个API添加另一个函数。

在我看来,您可以使用模板模式来管理可在子类中扩展的公共资源。例如,您有一个soaplogin公共抽象类,它可能有一些资源可供大多数子类使用。然后最好在超类中管理该资源,并在子类中传递回调以使用超类的资源。优点是您在一个地方管理资源

例如,我的超级类中有一个公共资源。我可以创建一个回调传递资源作为参数

interface ResourceCallback {
     T call(Resource resource);
}

然后可以在超级类中定义一个抽象方法,如doWithResource(ResourceCallback callback),所有子类现在都可以将该资源与自己的方法实现一起使用。

我发现每次都有用的一件事是包含一种方法,询问服务器正在运行的软件版本。您的
ping()
函数看起来应该这样做。也许我用ping()来证明服务是可访问的,这是错误的。我在关闭wsdl缓存的情况下进行了测试,没有wsdl?模具();但是一旦打开wsdl缓存,我就想不出另一种方法来证明服务已启动/可访问。我想将登录消息与“生命证明”消息分开。客户端还记录getCredentials响应字符串。。。但是是的,我想它可能会返回版本不…完全同意。检查这些基础知识对于高效的调试是必不可少的,我喜欢你关于ping的想法。我不确定为ping发送版本信息是否正常,或者是否应该将其放入
getVersionInfo
方法中(该方法也可以用作心跳检查函数),但我从大量soap服务的经验中了解到,您实际上希望轻松了解它的版本。soap和REST是两个可能并不完全一致的概念。思考SOAP的工作方式通常会导致设计非常糟糕的REST服务。我没有说相反的话,我只是做了一个设计,调用了同一个类Webservice,但是REST和SOAP扩展了这个类,只是为了语义问题。它们不做相同的事情,这就是为什么我们使用不同的接口,但它们都是WebService。我将向您展示一个UML表示,因为它不清楚。我将编辑我的回答我的观点是:SOAP和Rest之间的区别不仅仅是语义上的。它们通常差异太大,无法纳入多态性的概念。当然,您可以定义一个只对POST请求起作用的Rest服务,并要求调用的方法出现在HTTP头中,您不需要真正使用XML作为数据格式,也可以使用JSON——但这不是真正的Rest服务,而是伪装的Soap服务。这样一个Rest服务的API会被认为设计得非常糟糕。我真的不知道问题出在哪里。我已经在实际应用中使用了它,没有问题。如果您正确定义了类,那么这不是设计问题。但用另一张图表回答,也许我会同意你的观点。