【问题标题】:Listening to PHP function calls to intercept the returned value监听PHP函数调用拦截返回值
【发布时间】:2010-05-19 17:01:12
【问题描述】:

我正在努力利用我们内部系统主机提供的 Web 服务 API。我通过内置 SOAP 产品的 PHP 访问它。

API 会话由远程调用返回一些会话令牌的函数发起;此后对任何函数的每次调用都将返回一个新的会话令牌,该令牌必须伴随下一个请求。

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

到目前为止,我能想到的唯一方法是创建一个扩展 SoapClient 类的新类,使用 __call 函数包装器来执行函数、更新新会话令牌并返回结果。我不确定这是否会 a) 起作用 b) 是否是解决此问题的最佳方法。包装类与进行 SOAP 调用相同,它会返回相同的结果,只是它会在您返回结果之前更新会话令牌。

【问题讨论】:

    标签: php web-services soap wsdl


    【解决方案1】:

    听起来不错,我做过类似的事情。你可能想要这样的东西:

    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% 肯定这是正确的语法,但我认为它很接近......)

    编辑:根据您的 cmets 进行修改。

    【讨论】:

    • 感谢您的意见!我正在按照这些思路实施一些事情。我遇到的麻烦是调用 YourWrapperClassObj->startSession(...) 通过 SoapClient::__soapCall('startSession', ...) 而不是 YourWrapperClass::__soapCall('startSession', ...) 不知道为什么行为正在发生或如何控制它。再次感谢。
    • @Lansen:啊,好点子!我修改了我的答案。不要在对象本身上调用 startSession。让 __soapCall 检查会话是否已启动,如果没有,则启动它。看看我更新的答案,这有意义吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2018-09-08
    • 2018-08-25
    • 1970-01-01
    • 2017-01-22
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多