监听PHP函数调用以拦截返回的值

问题描述:

我正在使用由我们内部系统的主机提供的Web服务API。我使用内置的SOAP产品通过PHP访问它。监听PHP函数调用以拦截返回的值

API会话是通过对返回某些会话令牌的函数的远程调用启动的;之后每次调用任何函数都将返回一个新的会话令牌,该令牌必须伴随下一个请求。

我有一个正在完成大部分工作的API客户端类;我想要做的是设置一些东西,从而任何进行的SOAP调用都将确保使用新的会话详细信息更新API Client类的$ session变量,然后一起传递数据。

到目前为止,我能想到的唯一方法是创建一个扩展SoapClient类的新类,使用__call函数包装来执行函数,更新新的会话标记并返回结果。我不确定这会a)工作b)成为这方面的最佳途径。包装类将与进行SOAP调用相同,并且它将返回相同的结果,只是它会在返回结果之前更新会话标记。

+0

是的,这应该工作。 – Artefacto 2010-05-19 18:09:07

这听起来是正确的,我做了类似的事情。你可能想是这样的:

class YourWrapperClass extends SoapClient 
{ 
    private $session; 

    private function mMakeSureSessionIsStarted() 
    { 
    if(!$this->session) 
    { 
     // code to start session here... 
     $this->session = parent::startSession(); 
    } 
    } 

    public function __soapCall($method,array $arguments,array $options,$input_headers=null, array &$output_headers=null) 
    { 
    $this->mMakeSureSessionIsStarted(); 
    $arguments['session'] = $this->session; 
    return parent::__soapCall($method,$arguments,$options,$input_headers,$output_headers); 
    } 
} 

(不是100%肯定,就是正确的语法,但我认为它很接近......)

编辑:根据您的意见修改。

+0

感谢您的输入! 我正在沿着这些路线实施一些东西。我遇到的问题是调用YourWrapperClassObj-> startSession(...)通过SoapClient :: __ soapCall('startSession',...)而不是YourWrapperClass :: __ soapCall('startSession',...) 不确定为什么会发生这种行为或如何控制它。 再次感谢。 – 2010-05-19 18:08:48

+0

@朗森:啊,好点!我修改了我的答案。不要在对象本身上调用startSession。使__soapCall检查以查看会话是否已启动,如果未启动,请启动它。看到我更新的答案,这有什么意义吗? – Josh 2010-05-19 18:47:28