监听PHP函数调用以拦截返回的值
我正在使用由我们内部系统的主机提供的Web服务API。我使用内置的SOAP产品通过PHP访问它。监听PHP函数调用以拦截返回的值
API会话是通过对返回某些会话令牌的函数的远程调用启动的;之后每次调用任何函数都将返回一个新的会话令牌,该令牌必须伴随下一个请求。
我有一个正在完成大部分工作的API客户端类;我想要做的是设置一些东西,从而任何进行的SOAP调用都将确保使用新的会话详细信息更新API Client类的$ session变量,然后一起传递数据。
到目前为止,我能想到的唯一方法是创建一个扩展SoapClient类的新类,使用__call函数包装来执行函数,更新新的会话标记并返回结果。我不确定这会a)工作b)成为这方面的最佳途径。包装类将与进行SOAP调用相同,并且它将返回相同的结果,只是它会在返回结果之前更新会话标记。
这听起来是正确的,我做了类似的事情。你可能想是这样的:
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%肯定,就是正确的语法,但我认为它很接近......)
编辑:根据您的意见修改。
感谢您的输入! 我正在沿着这些路线实施一些东西。我遇到的问题是调用YourWrapperClassObj-> startSession(...)通过SoapClient :: __ soapCall('startSession',...)而不是YourWrapperClass :: __ soapCall('startSession',...) 不确定为什么会发生这种行为或如何控制它。 再次感谢。 – 2010-05-19 18:08:48
@朗森:啊,好点!我修改了我的答案。不要在对象本身上调用startSession。使__soapCall检查以查看会话是否已启动,如果未启动,请启动它。看到我更新的答案,这有什么意义吗? – Josh 2010-05-19 18:47:28
是的,这应该工作。 – Artefacto 2010-05-19 18:09:07