1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Afonso\Soapi; |
4
|
|
|
|
5
|
|
|
use League\Pipeline\Pipeline; |
6
|
|
|
use SoapServer as NativeSoapServer; |
7
|
|
|
|
8
|
|
|
/** |
9
|
|
|
* A enhanced, drop-in replacement for PHP's native SoapServer class. |
10
|
|
|
* |
11
|
|
|
* This server includes input and output pipelines to aribtrarily modify |
12
|
|
|
* requests and responses. |
13
|
|
|
*/ |
14
|
|
|
class SoapServer extends NativeSoapServer |
15
|
|
|
{ |
16
|
|
|
use ProcessesWithPipelines; |
17
|
|
|
|
18
|
|
|
/** |
19
|
|
|
* Creates and returns a new SoapServer with empty inbound and outbound |
20
|
|
|
* pipelines. |
21
|
|
|
* |
22
|
|
|
* @param string|null $wsdl |
23
|
|
|
* @param array $options |
24
|
|
|
*/ |
25
|
|
|
public function __construct($wsdl, array $options = array()) |
26
|
|
|
{ |
27
|
|
|
parent::__construct($wsdl, $options); |
28
|
|
|
|
29
|
|
|
// initialize in and outbound pipelines |
30
|
|
|
$this->inboundPipeline = new Pipeline(); |
31
|
|
|
$this->outboundPipeline = new Pipeline(); |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
/** |
35
|
|
|
* Handles a SOAP request. |
36
|
|
|
* |
37
|
|
|
* This function delegates on PHP's native SoapServer handle(), but |
38
|
|
|
* processes the input XML through the inbound and outbound pipelines. This |
39
|
|
|
* allows for arbitrary manipulation of requests and responses, such as |
40
|
|
|
* encryption or logging. |
41
|
|
|
* |
42
|
|
|
* Just as the parent class, this function will fetch the input from the |
43
|
|
|
* POST data if none is passed as an argument. Likewise, it will return |
44
|
|
|
* nothing and output the response instead. |
45
|
|
|
* |
46
|
|
|
* @see http://php.net/manual/en/soapserver.handle.php |
47
|
|
|
* @param string|null $soapRequest |
48
|
|
|
*/ |
49
|
|
|
public function handle($soapRequest = null) |
50
|
|
|
{ |
51
|
|
|
if (! $soapRequest) { |
52
|
|
|
$soapRequest = file_get_contents('php://input'); |
53
|
|
|
} |
54
|
|
|
|
55
|
|
|
/* |
56
|
|
|
* Run the request XML through the inbound pipeline. |
57
|
|
|
*/ |
58
|
|
|
$soapRequest = $this->inboundPipeline->process($soapRequest); |
59
|
|
|
|
60
|
|
|
/* |
61
|
|
|
* Execute the request. |
62
|
|
|
*/ |
63
|
|
|
ob_start(); |
64
|
|
|
parent::handle($soapRequest); |
65
|
|
|
$soapResponse = ob_get_clean(); |
66
|
|
|
|
67
|
|
|
/* |
68
|
|
|
* Then run the response through the outbound pipeline. |
69
|
|
|
*/ |
70
|
|
|
$soapResponse = $this->outboundPipeline->process($soapResponse); |
71
|
|
|
|
72
|
|
|
/* |
73
|
|
|
* Output the response and we're done. |
74
|
|
|
*/ |
75
|
|
|
$this->outputResponse($soapResponse); |
76
|
|
|
} |
77
|
|
|
|
78
|
|
|
protected function outputResponse($soapResponse) |
79
|
|
|
{ |
80
|
|
|
echo $soapResponse; |
81
|
|
|
header('Content-Type: text/xml; charset=utf8'); |
82
|
|
|
header('Content-Length: ' . strlen($soapResponse)); |
83
|
|
|
exit(0); |
|
|
|
|
84
|
|
|
} |
85
|
|
|
} |
86
|
|
|
|
An exit expression should only be used in rare cases. For example, if you write a short command line script.
In most cases however, using an
exit
expression makes the code untestable and often causes incompatibilities with other libraries. Thus, unless you are absolutely sure it is required here, we recommend to refactor your code to avoid its usage.