Subversion-Projekte lars-tiefland.laravel_shop

Revision

Revision 148 | Details | Vergleich mit vorheriger | 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(),
688 lars 46
                $this->addTraceToOutput(),
47
                $this->getRun()->getFrameFilters()
148 lars 48
            ),
49
        ];
50
 
51
        echo self::toXml($response);
52
 
53
        return Handler::QUIT;
54
    }
55
 
56
    /**
57
     * @return string
58
     */
59
    public function contentType()
60
    {
61
        return 'application/xml';
62
    }
63
 
64
    /**
65
     * @param  SimpleXMLElement  $node Node to append data to, will be modified in place
66
     * @param  array|\Traversable $data
67
     * @return SimpleXMLElement  The modified node, for chaining
68
     */
69
    private static function addDataToNode(\SimpleXMLElement $node, $data)
70
    {
71
        assert(is_array($data) || $data instanceof Traversable);
72
 
73
        foreach ($data as $key => $value) {
74
            if (is_numeric($key)) {
75
                // Convert the key to a valid string
76
                $key = "unknownNode_". (string) $key;
77
            }
78
 
79
            // Delete any char not allowed in XML element names
80
            $key = preg_replace('/[^a-z0-9\-\_\.\:]/i', '', $key);
81
 
82
            if (is_array($value)) {
83
                $child = $node->addChild($key);
84
                self::addDataToNode($child, $value);
85
            } else {
86
                $value = str_replace('&', '&amp;', print_r($value, true));
87
                $node->addChild($key, $value);
88
            }
89
        }
90
 
91
        return $node;
92
    }
93
 
94
    /**
95
     * The main function for converting to an XML document.
96
     *
97
     * @param  array|\Traversable $data
98
     * @return string            XML
99
     */
100
    private static function toXml($data)
101
    {
102
        assert(is_array($data) || $data instanceof Traversable);
103
 
104
        $node = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><root />");
105
 
106
        return self::addDataToNode($node, $data)->asXML();
107
    }
108
}