Subversion-Projekte lars-tiefland.laravel_shop

Revision

Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
/**
3
 * Whoops - php errors for cool kids
4
 * @author Filipe Dobreira <http://github.com/filp>
5
 */
6
 
7
namespace Whoops\Handler;
8
 
9
use SimpleXMLElement;
10
use Whoops\Exception\Formatter;
11
 
12
/**
13
 * Catches an exception and converts it to an XML
14
 * response. Additionally can also return exception
15
 * frames for consumption by an API.
16
 */
17
class XmlResponseHandler extends Handler
18
{
19
    /**
20
     * @var bool
21
     */
22
    private $returnFrames = false;
23
 
24
    /**
25
     * @param  bool|null  $returnFrames
26
     * @return bool|static
27
     */
28
    public function addTraceToOutput($returnFrames = null)
29
    {
30
        if (func_num_args() == 0) {
31
            return $this->returnFrames;
32
        }
33
 
34
        $this->returnFrames = (bool) $returnFrames;
35
        return $this;
36
    }
37
 
38
    /**
39
     * @return int
40
     */
41
    public function handle()
42
    {
43
        $response = [
44
            'error' => Formatter::formatExceptionAsDataArray(
45
                $this->getInspector(),
46
                $this->addTraceToOutput()
47
            ),
48
        ];
49
 
50
        echo self::toXml($response);
51
 
52
        return Handler::QUIT;
53
    }
54
 
55
    /**
56
     * @return string
57
     */
58
    public function contentType()
59
    {
60
        return 'application/xml';
61
    }
62
 
63
    /**
64
     * @param  SimpleXMLElement  $node Node to append data to, will be modified in place
65
     * @param  array|\Traversable $data
66
     * @return SimpleXMLElement  The modified node, for chaining
67
     */
68
    private static function addDataToNode(\SimpleXMLElement $node, $data)
69
    {
70
        assert(is_array($data) || $data instanceof Traversable);
71
 
72
        foreach ($data as $key => $value) {
73
            if (is_numeric($key)) {
74
                // Convert the key to a valid string
75
                $key = "unknownNode_". (string) $key;
76
            }
77
 
78
            // Delete any char not allowed in XML element names
79
            $key = preg_replace('/[^a-z0-9\-\_\.\:]/i', '', $key);
80
 
81
            if (is_array($value)) {
82
                $child = $node->addChild($key);
83
                self::addDataToNode($child, $value);
84
            } else {
85
                $value = str_replace('&', '&amp;', print_r($value, true));
86
                $node->addChild($key, $value);
87
            }
88
        }
89
 
90
        return $node;
91
    }
92
 
93
    /**
94
     * The main function for converting to an XML document.
95
     *
96
     * @param  array|\Traversable $data
97
     * @return string            XML
98
     */
99
    private static function toXml($data)
100
    {
101
        assert(is_array($data) || $data instanceof Traversable);
102
 
103
        $node = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><root />");
104
 
105
        return self::addDataToNode($node, $data)->asXML();
106
    }
107
}