Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

FlattenException.php

Zuletzt modifiziert: 02.04.2025, 15:03 - Dateigröße: 6.93 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\Debug\Exception;
013   
014  use Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface;
015  use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
016   
017  /**
018   * FlattenException wraps a PHP Exception to be able to serialize it.
019   *
020   * Basically, this class removes all objects from the trace.
021   *
022   * @author Fabien Potencier <fabien@symfony.com>
023   */
024  class FlattenException
025  {
026      private $message;
027      private $code;
028      private $previous;
029      private $trace;
030      private $class;
031      private $statusCode;
032      private $headers;
033      private $file;
034      private $line;
035   
036      public static function create(\Exception $exception, $statusCode = null, array $headers = [])
037      {
038          $e = new static();
039          $e->setMessage($exception->getMessage());
040          $e->setCode($exception->getCode());
041   
042          if ($exception instanceof HttpExceptionInterface) {
043              $statusCode = $exception->getStatusCode();
044              $headers = array_merge($headers, $exception->getHeaders());
045          } elseif ($exception instanceof RequestExceptionInterface) {
046              $statusCode = 400;
047          }
048   
049          if (null === $statusCode) {
050              $statusCode = 500;
051          }
052   
053          $e->setStatusCode($statusCode);
054          $e->setHeaders($headers);
055          $e->setTraceFromException($exception);
056          $e->setClass(\get_class($exception));
057          $e->setFile($exception->getFile());
058          $e->setLine($exception->getLine());
059   
060          $previous = $exception->getPrevious();
061   
062          if ($previous instanceof \Exception) {
063              $e->setPrevious(static::create($previous));
064          } elseif ($previous instanceof \Throwable) {
065              $e->setPrevious(static::create(new FatalThrowableError($previous)));
066          }
067   
068          return $e;
069      }
070   
071      public function toArray()
072      {
073          $exceptions = [];
074          foreach (array_merge([$this], $this->getAllPrevious()) as $exception) {
075              $exceptions[] = [
076                  'message' => $exception->getMessage(),
077                  'class' => $exception->getClass(),
078                  'trace' => $exception->getTrace(),
079              ];
080          }
081   
082          return $exceptions;
083      }
084   
085      public function getStatusCode()
086      {
087          return $this->statusCode;
088      }
089   
090      public function setStatusCode($code)
091      {
092          $this->statusCode = $code;
093      }
094   
095      public function getHeaders()
096      {
097          return $this->headers;
098      }
099   
100      public function setHeaders(array $headers)
101      {
102          $this->headers = $headers;
103      }
104   
105      public function getClass()
106      {
107          return $this->class;
108      }
109   
110      public function setClass($class)
111      {
112          $this->class = $class;
113      }
114   
115      public function getFile()
116      {
117          return $this->file;
118      }
119   
120      public function setFile($file)
121      {
122          $this->file = $file;
123      }
124   
125      public function getLine()
126      {
127          return $this->line;
128      }
129   
130      public function setLine($line)
131      {
132          $this->line = $line;
133      }
134   
135      public function getMessage()
136      {
137          return $this->message;
138      }
139   
140      public function setMessage($message)
141      {
142          $this->message = $message;
143      }
144   
145      public function getCode()
146      {
147          return $this->code;
148      }
149   
150      public function setCode($code)
151      {
152          $this->code = $code;
153      }
154   
155      public function getPrevious()
156      {
157          return $this->previous;
158      }
159   
160      public function setPrevious(self $previous)
161      {
162          $this->previous = $previous;
163      }
164   
165      public function getAllPrevious()
166      {
167          $exceptions = [];
168          $e = $this;
169          while ($e = $e->getPrevious()) {
170              $exceptions[] = $e;
171          }
172   
173          return $exceptions;
174      }
175   
176      public function getTrace()
177      {
178          return $this->trace;
179      }
180   
181      public function setTraceFromException(\Exception $exception)
182      {
183          $this->setTrace($exception->getTrace(), $exception->getFile(), $exception->getLine());
184      }
185   
186      public function setTrace($trace, $file, $line)
187      {
188          $this->trace = [];
189          $this->trace[] = [
190              'namespace' => '',
191              'short_class' => '',
192              'class' => '',
193              'type' => '',
194              'function' => '',
195              'file' => $file,
196              'line' => $line,
197              'args' => [],
198          ];
199          foreach ($trace as $entry) {
200              $class = '';
201              $namespace = '';
202              if (isset($entry['class'])) {
203                  $parts = explode('\\', $entry['class']);
204                  $class = array_pop($parts);
205                  $namespace = implode('\\', $parts);
206              }
207   
208              $this->trace[] = [
209                  'namespace' => $namespace,
210                  'short_class' => $class,
211                  'class' => isset($entry['class']) ? $entry['class'] : '',
212                  'type' => isset($entry['type']) ? $entry['type'] : '',
213                  'function' => isset($entry['function']) ? $entry['function'] : null,
214                  'file' => isset($entry['file']) ? $entry['file'] : null,
215                  'line' => isset($entry['line']) ? $entry['line'] : null,
216                  'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : [],
217              ];
218          }
219      }
220   
221      private function flattenArgs($args, $level = 0, &$count = 0)
222      {
223          $result = [];
224          foreach ($args as $key => $value) {
225              if (++$count > 1e4) {
226                  return ['array', '*SKIPPED over 10000 entries*'];
227              }
228              if ($value instanceof \__PHP_Incomplete_Class) {
229                  // is_object() returns false on PHP<=7.1
230                  $result[$key] = ['incomplete-object', $this->getClassNameFromIncomplete($value)];
231              } elseif (\is_object($value)) {
232                  $result[$key] = ['object', \get_class($value)];
233              } elseif (\is_array($value)) {
234                  if ($level > 10) {
235                      $result[$key] = ['array', '*DEEP NESTED ARRAY*'];
236                  } else {
237                      $result[$key] = ['array', $this->flattenArgs($value, $level + 1, $count)];
238                  }
239              } elseif (null === $value) {
240                  $result[$key] = ['null', null];
241              } elseif (\is_bool($value)) {
242                  $result[$key] = ['boolean', $value];
243              } elseif (\is_int($value)) {
244                  $result[$key] = ['integer', $value];
245              } elseif (\is_float($value)) {
246                  $result[$key] = ['float', $value];
247              } elseif (\is_resource($value)) {
248                  $result[$key] = ['resource', get_resource_type($value)];
249              } else {
250                  $result[$key] = ['string', (string) $value];
251              }
252          }
253   
254          return $result;
255      }
256   
257      private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value)
258      {
259          $array = new \ArrayObject($value);
260   
261          return $array['__PHP_Incomplete_Class_Name'];
262      }
263  }
264