Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Fault.php
Go to the documentation of this file.
1 <?php
9 
11 
12 class Fault
13 {
14  const FAULT_REASON_INTERNAL = 'Internal Error.';
15 
19  const FAULT_CODE_SENDER = 'Sender';
20  const FAULT_CODE_RECEIVER = 'Receiver';
21 
25  const NODE_DETAIL_PARAMETERS = 'Parameters';
26  const NODE_DETAIL_WRAPPED_ERRORS = 'WrappedErrors';
27  const NODE_DETAIL_WRAPPED_EXCEPTION = 'WrappedException';
28  /* Note that parameter node must be unique in scope of all complex types declared in WSDL */
29  const NODE_DETAIL_PARAMETER = 'GenericFaultParameter';
31  const NODE_DETAIL_PARAMETER_VALUE = 'value';
32  const NODE_DETAIL_WRAPPED_ERROR = 'WrappedError';
38  const NODE_DETAIL_TRACE = 'Trace';
39  const NODE_DETAIL_WRAPPER = 'GenericFault';
45  protected $_soapFaultCode;
46 
52  protected $_parameters = [];
53 
59  protected $_wrappedErrors = [];
60 
66  protected $_faultName = '';
67 
73  protected $_details = [];
74 
78  protected $_request;
79 
83  protected $_soapServer;
84 
88  protected $_localeResolver;
89 
93  protected $appState;
94 
98  protected $stackTrace;
99 
103  protected $message;
104 
112  public function __construct(
113  \Magento\Framework\App\RequestInterface $request,
114  Server $soapServer,
115  \Magento\Framework\Webapi\Exception $exception,
116  \Magento\Framework\Locale\ResolverInterface $localeResolver,
118  ) {
119  $this->_soapFaultCode = $exception->getOriginator();
120  $this->_parameters = $exception->getDetails();
121  $this->_wrappedErrors = $exception->getErrors();
122  $this->stackTrace = $exception->getStackTrace() ?: $exception->getTraceAsString();
123  $this->message = $exception->getMessage();
124  $this->_request = $request;
125  $this->_soapServer = $soapServer;
126  $this->_localeResolver = $localeResolver;
127  $this->appState = $appState;
128  }
129 
135  public function toXml()
136  {
137  if ($this->appState->getMode() == State::MODE_DEVELOPER) {
138  $this->addDetails([self::NODE_DETAIL_TRACE => "<![CDATA[{$this->stackTrace}]]>"]);
139  }
140  if ($this->getParameters()) {
141  $this->addDetails([self::NODE_DETAIL_PARAMETERS => $this->getParameters()]);
142  }
143  if ($this->getWrappedErrors()) {
144  $this->addDetails([self::NODE_DETAIL_WRAPPED_ERRORS => $this->getWrappedErrors()]);
145  }
146 
147  return $this->getSoapFaultMessage($this->getMessage(), $this->getSoapCode(), $this->getDetails());
148  }
149 
155  public function getParameters()
156  {
157  return $this->_parameters;
158  }
159 
165  public function getWrappedErrors()
166  {
167  return $this->_wrappedErrors;
168  }
169 
176  public function addDetails($details)
177  {
178  $this->_details = array_merge($this->_details, $details);
179  return $this;
180  }
181 
187  public function getDetails()
188  {
189  return $this->_details;
190  }
191 
197  public function getSoapCode()
198  {
199  return $this->_soapFaultCode;
200  }
201 
207  public function getLanguage()
208  {
209  return \Locale::getPrimaryLanguage($this->_localeResolver->getLocale());
210  }
211 
215  public function getMessage()
216  {
217  return $this->message;
218  }
219 
228  public function getSoapFaultMessage($reason, $code, $details = null)
229  {
230  $detailXml = $this->_generateDetailXml($details);
231  $language = $this->getLanguage();
232  $detailsNamespace = !empty($detailXml)
233  ? 'xmlns:m="' . urlencode($this->_soapServer->generateUri(true)) . '"'
234  : '';
235  $reason = htmlentities($reason);
236  $message = <<<FAULT_MESSAGE
237 <?xml version="1.0" encoding="utf-8" ?>
238 <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" $detailsNamespace>
239  <env:Body>
240  <env:Fault>
241  <env:Code>
242  <env:Value>env:$code</env:Value>
243  </env:Code>
244  <env:Reason>
245  <env:Text xml:lang="$language">$reason</env:Text>
246  </env:Reason>
247  $detailXml
248  </env:Fault>
249  </env:Body>
250 </env:Envelope>
251 FAULT_MESSAGE;
252  return $message;
253  }
254 
263  protected function _generateDetailXml($details)
264  {
265  $detailsXml = '';
266  if (is_array($details) && !empty($details)) {
267  $detailsXml = $this->_convertDetailsToXml($details);
268  if ($detailsXml) {
269  $errorDetailsNode = self::NODE_DETAIL_WRAPPER;
270  $detailsXml = "<env:Detail><m:{$errorDetailsNode}>"
271  . $detailsXml . "</m:{$errorDetailsNode}></env:Detail>";
272  } else {
273  $detailsXml = '';
274  }
275  }
276  return $detailsXml;
277  }
278 
285  protected function _convertDetailsToXml($details)
286  {
287  $detailsXml = '';
288  foreach ($details as $detailNode => $detailValue) {
289  $detailNode = htmlspecialchars($detailNode);
290  if (is_numeric($detailNode)) {
291  continue;
292  }
293  switch ($detailNode) {
295  if (is_string($detailValue) || is_numeric($detailValue)) {
296  $detailsXml .= "<m:{$detailNode}>" . htmlspecialchars($detailValue) . "</m:{$detailNode}>";
297  }
298  break;
300  $detailsXml .= $this->_getParametersXml($detailValue);
301  break;
303  $detailsXml .= $this->_getWrappedErrorsXml($detailValue);
304  break;
305  }
306  }
307  return $detailsXml;
308  }
309 
316  protected function _getParametersXml($parameters)
317  {
318  $result = '';
319  if (!is_array($parameters)) {
320  return $result;
321  }
322  $paramsXml = '';
323  foreach ($parameters as $parameterName => $parameterValue) {
324  if ((is_string($parameterName) || is_numeric($parameterName))
325  && (is_string($parameterValue) || is_numeric($parameterValue))
326  ) {
329  $parameterNode = self::NODE_DETAIL_PARAMETER;
330  if (is_numeric($parameterName)) {
331  $parameterName++;
332  }
333  $paramsXml .= "<m:$parameterNode><m:$keyNode>$parameterName</m:$keyNode><m:$valueNode>"
334  . htmlspecialchars($parameterValue) . "</m:$valueNode></m:$parameterNode>";
335  }
336  }
337  if (!empty($paramsXml)) {
338  $parametersNode = self::NODE_DETAIL_PARAMETERS;
339  $result = "<m:$parametersNode>" . $paramsXml . "</m:$parametersNode>";
340  }
341 
342  return $result;
343  }
344 
351  protected function _getWrappedErrorsXml($wrappedErrors)
352  {
353  $result = '';
354  if (!is_array($wrappedErrors)) {
355  return $result;
356  }
357 
358  $errorsXml = '';
359  foreach ($wrappedErrors as $error) {
360  $errorsXml .= $this->_generateErrorNodeXML($error);
361  }
362  if (!empty($errorsXml)) {
363  $wrappedErrorsNode = self::NODE_DETAIL_WRAPPED_ERRORS;
364  $result = "<m:$wrappedErrorsNode>" . $errorsXml . "</m:$wrappedErrorsNode>";
365  }
366 
367  return $result;
368  }
369 
376  protected function _generateErrorNodeXML($error)
377  {
378  $wrappedErrorNode = self::NODE_DETAIL_WRAPPED_ERROR;
380 
381  $parameters = $error->getParameters();
382  $rawMessage = $error->getRawMessage();
383  $xml = "<m:$wrappedErrorNode><m:$messageNode>$rawMessage</m:$messageNode>";
384 
385  if (!empty($parameters)) {
387  $xml .= "<m:$parametersNode>";
388  foreach ($parameters as $key => $value) {
392  $xml .= "<m:$parameterNode>" .
393  "<m:$keyNode>$key</m:$keyNode><m:$valueNode>$value</m:$valueNode>" .
394  "</m:$parameterNode>";
395  }
396  $xml .= "</m:$parametersNode>";
397  }
398  $xml .= "</m:$wrappedErrorNode>";
399 
400  return $xml;
401  }
402 }
$details
Definition: vault.phtml:10
_getWrappedErrorsXml($wrappedErrors)
Definition: Fault.php:351
__construct(\Magento\Framework\App\RequestInterface $request, Server $soapServer, \Magento\Framework\Webapi\Exception $exception, \Magento\Framework\Locale\ResolverInterface $localeResolver, State $appState)
Definition: Fault.php:112
const NODE_DETAIL_WRAPPED_ERROR_PARAMETERS
Definition: Fault.php:34
const NODE_DETAIL_WRAPPED_ERROR_PARAMETER
Definition: Fault.php:35
getSoapFaultMessage($reason, $code, $details=null)
Definition: Fault.php:228
$value
Definition: gender.phtml:16
_getParametersXml($parameters)
Definition: Fault.php:316
$code
Definition: info.phtml:12