PHPでは、SOAPによって呼び出されるメソッドがどうなるか知りたいです。これが理解するためのサンプルです...
$soapserver = new SoapServer();
$soapserver->setClass('myClass');
$soapserver->handle();
私が知りたいのは、handle()で実行されるメソッドの名前です。
ありがとうございました !!
PHPでは、SOAPによって呼び出されるメソッドがどうなるか知りたいです。これが理解するためのサンプルです...
$soapserver = new SoapServer();
$soapserver->setClass('myClass');
$soapserver->handle();
私が知りたいのは、handle()で実行されるメソッドの名前です。
ありがとうございました !!
私の意見では、この状況で呼び出されたオペレーションの名前にアクセスするための最もクリーンでエレガントな方法は、ある種のラッパーまたはサロゲートデザインパターンを使用することです。意図に応じて、デコレータまたはプロキシのいずれかを使用します。
Handler
例として、クラス自体に触れることなく、オブジェクトにいくつかの追加機能を動的に追加したいとします。これにより、Handler
クラスをよりクリーンに保つことができ、したがって、クラスの直接的な責任により集中することができます。そのような機能は、メソッドとそのパラメーターのログ記録、またはある種のキャッシュメカニズムの実装である可能性があります。このために、Decoratorデザインパターンを使用します。これを行う代わりに:
class MyHandlerClass
{
public function operation1($params)
{
// does some stuff here
}
public function operation2($params)
{
// does some other stuff here
}
}
$soapserver = new SoapServer(null, array('uri' => "http://test-uri/"));
$soapserver->setClass('MyHandlerClass');
$soapserver->handle();
次のことを行います。
class MyHandlerClassDecorator
{
private $decorated = null;
public function __construct(MyHandlerClass $decorated)
{
$this->decorated = $decorated;
}
public function __call($method, $params)
{
// do something with the $method and $params
// then call the real $method
if (method_exists($this->decorated, $method)) {
return call_user_func_array(
array($this->decorated, $method), $params);
} else {
throw new BadMethodCallException();
}
}
}
$soapserver = new SoapServer(null, array('uri' => "http://test-uri/"));
$soapserver->setObject(new MyHandlerClassDecorator(new MyHandlerClass()));
$soapserver->handle();
たとえば、ハンドラーの操作へのアクセスを制御する場合は、アクセス権を課すために、プロキシデザインパターンを使用します。
私はこれが古い投稿であることを知っていますが、誰かがこの解決策を利用する可能性があります。生のHTTPPOSTデータからデータを抽出できるはずです。$_POST
は空であるため使用できませんが$HTTP_RAW_POST_DATA
、XML形式のSOAPリクエストで文字列を含む事前定義された変数を使用できます。
メソッド名は、次の<soapenv:Body>
ようにタグの最初のノードにある必要があります。
<!--
...
XML header, SOAP header etc.
...
-->
<soapenv:Body>
<urn:methodName soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<param1 xsi:type="xsd:string" xs:type="type:string" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">param1 value</param1>
<param2 xsi:type="xsd:string" xs:type="type:string" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">param2 value</param2>
</urn:methodName>
</soapenv:Body>
<!--
...
-->
SimpleXMLのようなもので解析するか、通常の式を使用して取得することmethodName
ができますが、文字列urn:
はヘッダーで定義された名前空間であるため、何でもかまいません。
最も良い方法ではありませんが、このhttp://danpolant.com/use-the-output-buffer-to-debug-a-soap-server/をなんとかして使用できます。
迅速で非常に汚いアプローチの場合(これは1回限りのデバッグにのみ使用し、本番コードでは使用しないでください!):メソッド本体で各SOAPメソッドの名前を使用してグローバル変数を割り当て、その後で必要な操作を行うだけです。上記のリンクで説明されているように、SoapServerはその役割を果たします。このようなもの(テストされていないコード):
$method = "";
class test
{
function call1()
{
global $method; $method = "call1";
}
}
ob_start();
$soapserver = new SoapServer();
$soapserver->setClass('test');
$soapserver->handle();
$mystring = ob_get_contents(); // retrieve all output thus far
ob_end_clean (); // stop buffering
log($mystring); // log output
log($method); // log method
echo $mystring; // now send it
通常(常にではありませんが、クライアントによって異なります)$_SERVER['HTTP_SOAPACTION']
が設定され、そこから呼び出されたメソッドの名前を取得できます。