1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Meng\Soap; |
4
|
|
|
|
5
|
|
|
/** |
6
|
|
|
* @internal |
7
|
|
|
*/ |
8
|
|
|
class Soap extends \SoapClient |
9
|
|
|
{ |
10
|
|
|
private $endpoint; |
11
|
|
|
private $soapRequest; |
12
|
|
|
private $soapResponse; |
13
|
|
|
private $soapAction; |
14
|
|
|
private $soapVersion; |
15
|
|
|
|
16
|
|
|
public function __construct($wsdl, array $options) |
17
|
|
|
{ |
18
|
|
|
unset($options['login']); |
19
|
|
|
unset($options['password']); |
20
|
|
|
unset($options['proxy_host']); |
21
|
|
|
unset($options['proxy_port']); |
22
|
|
|
unset($options['proxy_login']); |
23
|
|
|
unset($options['proxy_password']); |
24
|
|
|
unset($options['local_cert']); |
25
|
|
|
unset($options['passphrase']); |
26
|
|
|
unset($options['authentication']); |
27
|
|
|
unset($options['compression']); |
28
|
|
|
unset($options['trace']); |
29
|
|
|
unset($options['connection_timeout']); |
30
|
|
|
unset($options['user_agent']); |
31
|
|
|
unset($options['stream_context']); |
32
|
|
|
unset($options['keep_alive']); |
33
|
|
|
unset($options['ssl_method']); |
34
|
|
|
parent::__construct($wsdl, $options); |
|
|
|
|
35
|
|
|
} |
36
|
|
|
|
37
|
|
|
public function __doRequest($request, $location, $action, $version, $one_way = 0) |
38
|
|
|
{ |
39
|
|
|
if (null !== $this->soapResponse) { |
40
|
|
|
return $this->soapResponse; |
41
|
|
|
} |
42
|
|
|
|
43
|
|
|
$this->endpoint = (string)$location; |
44
|
|
|
$this->soapAction = (string)$action; |
45
|
|
|
$this->soapVersion = (string)$version; |
46
|
|
|
$this->soapRequest = (string)$request; |
47
|
|
|
return ''; |
48
|
|
|
} |
49
|
|
|
|
50
|
|
|
public function request($function_name, $arguments, $options, $input_headers) |
51
|
|
|
{ |
52
|
|
|
$this->__soapCall($function_name, $arguments, $options, $input_headers); |
53
|
|
|
return new SoapRequest($this->endpoint, $this->soapAction, $this->soapVersion, $this->soapRequest); |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
public function response($response, $function_name, &$output_headers) |
57
|
|
|
{ |
58
|
|
|
$this->soapResponse = $response; |
59
|
|
|
try { |
60
|
|
|
$response = $this->__soapCall($function_name, [], null, null, $output_headers); |
61
|
|
|
} catch (\SoapFault $fault) { |
62
|
|
|
$this->soapResponse = null; |
63
|
|
|
throw $fault; |
64
|
|
|
} |
65
|
|
|
$this->soapResponse = null; |
66
|
|
|
return $response; |
67
|
|
|
} |
68
|
|
|
} |
69
|
|
|
|
Let’s take a look at an example:
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.
Available Fixes
Change the type-hint for the parameter:
Add an additional type-check:
Add the method to the parent class: