Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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

ExceptionHandler.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 12.36 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;
 013   
 014  use Symfony\Component\HttpFoundation\Response;
 015  use Symfony\Component\Debug\Exception\FlattenException;
 016   
 017  if (!defined('ENT_SUBSTITUTE')) {
 018      define('ENT_SUBSTITUTE', 8);
 019  }
 020   
 021  /**
 022   * ExceptionHandler converts an exception to a Response object.
 023   *
 024   * It is mostly useful in debug mode to replace the default PHP/XDebug
 025   * output with something prettier and more useful.
 026   *
 027   * As this class is mainly used during Kernel boot, where nothing is yet
 028   * available, the Response content is always HTML.
 029   *
 030   * @author Fabien Potencier <fabien@symfony.com>
 031   */
 032  class ExceptionHandler
 033  {
 034      private $debug;
 035      private $charset;
 036   
 037      public function __construct($debug = true, $charset = 'UTF-8')
 038      {
 039          $this->debug = $debug;
 040          $this->charset = $charset;
 041      }
 042   
 043      /**
 044       * Registers the exception handler.
 045       *
 046       * @param bool    $debug
 047       *
 048       * @return ExceptionHandler The registered exception handler
 049       */
 050      public static function register($debug = true)
 051      {
 052          $handler = new static($debug);
 053   
 054          set_exception_handler(array($handler, 'handle'));
 055   
 056          return $handler;
 057      }
 058   
 059      /**
 060       * Sends a response for the given Exception.
 061       *
 062       * If you have the Symfony HttpFoundation component installed,
 063       * this method will use it to create and send the response. If not,
 064       * it will fallback to plain PHP functions.
 065       *
 066       * @param \Exception $exception An \Exception instance
 067       *
 068       * @see sendPhpResponse
 069       * @see createResponse
 070       */
 071      public function handle(\Exception $exception)
 072      {
 073          if (class_exists('Symfony\Component\HttpFoundation\Response')) {
 074              $this->createResponse($exception)->send();
 075          } else {
 076              $this->sendPhpResponse($exception);
 077          }
 078      }
 079   
 080      /**
 081       * Sends the error associated with the given Exception as a plain PHP response.
 082       *
 083       * This method uses plain PHP functions like header() and echo to output
 084       * the response.
 085       *
 086       * @param \Exception|FlattenException $exception An \Exception instance
 087       */
 088      public function sendPhpResponse($exception)
 089      {
 090          if (!$exception instanceof FlattenException) {
 091              $exception = FlattenException::create($exception);
 092          }
 093   
 094          if (!headers_sent()) {
 095              header(sprintf('HTTP/1.0 %s', $exception->getStatusCode()));
 096              foreach ($exception->getHeaders() as $name => $value) {
 097                  header($name.': '.$value, false);
 098              }
 099          }
 100   
 101          echo $this->decorate($this->getContent($exception), $this->getStylesheet($exception));
 102      }
 103   
 104      /**
 105       * Creates the error Response associated with the given Exception.
 106       *
 107       * @param \Exception|FlattenException $exception An \Exception instance
 108       *
 109       * @return Response A Response instance
 110       */
 111      public function createResponse($exception)
 112      {
 113          if (!$exception instanceof FlattenException) {
 114              $exception = FlattenException::create($exception);
 115          }
 116   
 117          return new Response($this->decorate($this->getContent($exception), $this->getStylesheet($exception)), $exception->getStatusCode(), $exception->getHeaders());
 118      }
 119   
 120      /**
 121       * Gets the HTML content associated with the given exception.
 122       *
 123       * @param FlattenException $exception A FlattenException instance
 124       *
 125       * @return string The content as a string
 126       */
 127      public function getContent(FlattenException $exception)
 128      {
 129          switch ($exception->getStatusCode()) {
 130              case 404:
 131                  $title = 'Sorry, the page you are looking for could not be found.';
 132                  break;
 133              default:
 134                  $title = 'Whoops, looks like something went wrong.';
 135          }
 136   
 137          $content = '';
 138          if ($this->debug) {
 139              try {
 140                  $count = count($exception->getAllPrevious());
 141                  $total = $count + 1;
 142                  foreach ($exception->toArray() as $position => $e) {
 143                      $ind = $count - $position + 1;
 144                      $class = $this->abbrClass($e['class']);
 145                      $message = nl2br($e['message']);
 146                      $content .= sprintf(<<<EOF
 147                          <div class="block_exception clear_fix">
 148                              <h2><span>%d/%d</span> %s: %s</h2>
 149                          </div>
 150                          <div class="block">
 151                              <ol class="traces list_exception">
 152   
 153  EOF
 154                          , $ind, $total, $class, $message);
 155                      foreach ($e['trace'] as $trace) {
 156                          $content .= '       <li>';
 157                          if ($trace['function']) {
 158                              $content .= sprintf('at %s%s%s(%s)', $this->abbrClass($trace['class']), $trace['type'], $trace['function'], $this->formatArgs($trace['args']));
 159                          }
 160                          if (isset($trace['file']) && isset($trace['line'])) {
 161                              if ($linkFormat = ini_get('xdebug.file_link_format')) {
 162                                  $link = str_replace(array('%f', '%l'), array($trace['file'], $trace['line']), $linkFormat);
 163                                  $content .= sprintf(' in <a href="%s" title="Go to source">%s line %s</a>', $link, $trace['file'], $trace['line']);
 164                              } else {
 165                                  $content .= sprintf(' in %s line %s', $trace['file'], $trace['line']);
 166                              }
 167                          }
 168                          $content .= "</li>\n";
 169                      }
 170   
 171                      $content .= "    </ol>\n</div>\n";
 172                  }
 173              } catch (\Exception $e) {
 174                  // something nasty happened and we cannot throw an exception anymore
 175                  if ($this->debug) {
 176                      $title = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($exception), $exception->getMessage());
 177                  } else {
 178                      $title = 'Whoops, looks like something went wrong.';
 179                  }
 180              }
 181          }
 182   
 183          return <<<EOF
 184              <div id="sf-resetcontent" class="sf-reset">
 185                  <h1>$title</h1>
 186                  $content
 187              </div>
 188  EOF;
 189   
 190      }
 191   
 192      /**
 193       * Gets the stylesheet associated with the given exception.
 194       *
 195       * @param FlattenException $exception A FlattenException instance
 196       *
 197       * @return string The stylesheet as a string
 198       */
 199      public function getStylesheet(FlattenException $exception)
 200      {
 201          return <<<EOF
 202              .sf-reset { font: 11px Verdana, Arial, sans-serif; color: #333 }
 203              .sf-reset .clear { clear:both; height:0; font-size:0; line-height:0; }
 204              .sf-reset .clear_fix:after { display:block; height:0; clear:both; visibility:hidden; }
 205              .sf-reset .clear_fix { display:inline-block; }
 206              .sf-reset * html .clear_fix { height:1%; }
 207              .sf-reset .clear_fix { display:block; }
 208              .sf-reset, .sf-reset .block { margin: auto }
 209              .sf-reset abbr { border-bottom: 1px dotted #000; cursor: help; }
 210              .sf-reset p { font-size:14px; line-height:20px; color:#868686; padding-bottom:20px }
 211              .sf-reset strong { font-weight:bold; }
 212              .sf-reset a { color:#6c6159; }
 213              .sf-reset a img { border:none; }
 214              .sf-reset a:hover { text-decoration:underline; }
 215              .sf-reset em { font-style:italic; }
 216              .sf-reset h1, .sf-reset h2 { font: 20px Georgia, "Times New Roman", Times, serif }
 217              .sf-reset h2 span { background-color: #fff; color: #333; padding: 6px; float: left; margin-right: 10px; }
 218              .sf-reset .traces li { font-size:12px; padding: 2px 4px; list-style-type:decimal; margin-left:20px; }
 219              .sf-reset .block { background-color:#FFFFFF; padding:10px 28px; margin-bottom:20px;
 220                  -webkit-border-bottom-right-radius: 16px;
 221                  -webkit-border-bottom-left-radius: 16px;
 222                  -moz-border-radius-bottomright: 16px;
 223                  -moz-border-radius-bottomleft: 16px;
 224                  border-bottom-right-radius: 16px;
 225                  border-bottom-left-radius: 16px;
 226                  border-bottom:1px solid #ccc;
 227                  border-right:1px solid #ccc;
 228                  border-left:1px solid #ccc;
 229              }
 230              .sf-reset .block_exception { background-color:#ddd; color: #333; padding:20px;
 231                  -webkit-border-top-left-radius: 16px;
 232                  -webkit-border-top-right-radius: 16px;
 233                  -moz-border-radius-topleft: 16px;
 234                  -moz-border-radius-topright: 16px;
 235                  border-top-left-radius: 16px;
 236                  border-top-right-radius: 16px;
 237                  border-top:1px solid #ccc;
 238                  border-right:1px solid #ccc;
 239                  border-left:1px solid #ccc;
 240                  overflow: hidden;
 241                  word-wrap: break-word;
 242              }
 243              .sf-reset li a { background:none; color:#868686; text-decoration:none; }
 244              .sf-reset li a:hover { background:none; color:#313131; text-decoration:underline; }
 245              .sf-reset ol { padding: 10px 0; }
 246              .sf-reset h1 { background-color:#FFFFFF; padding: 15px 28px; margin-bottom: 20px;
 247                  -webkit-border-radius: 10px;
 248                  -moz-border-radius: 10px;
 249                  border-radius: 10px;
 250                  border: 1px solid #ccc;
 251              }
 252  EOF;
 253   
 254      }
 255   
 256      private function decorate($content, $css)
 257      {
 258          return <<<EOF
 259  <!DOCTYPE html>
 260  <html>
 261      <head>
 262          <meta charset="UTF-8" />
 263          <meta name="robots" content="noindex,nofollow" />
 264          <style>
 265              /* Copyright (c) 2010, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html */
 266              html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}
 267   
 268              html { background: #eee; padding: 10px }
 269              img { border: 0; }
 270              #sf-resetcontent { width:970px; margin:0 auto; }
 271              $css
 272          </style>
 273      </head>
 274      <body>
 275          $content
 276      </body>
 277  </html>
 278  EOF;
 279   
 280      }
 281   
 282      private function abbrClass($class)
 283      {
 284          $parts = explode('\\', $class);
 285   
 286          return sprintf("<abbr title=\"%s\">%s</abbr>", $class, array_pop($parts));
 287      }
 288   
 289      /**
 290       * Formats an array as a string.
 291       *
 292       * @param array $args The argument array
 293       *
 294       * @return string
 295       */
 296      private function formatArgs(array $args)
 297      {
 298          $result = array();
 299          foreach ($args as $key => $item) {
 300              if ('object' === $item[0]) {
 301                  $formattedValue = sprintf("<em>object</em>(%s)", $this->abbrClass($item[1]));
 302              } elseif ('array' === $item[0]) {
 303                  $formattedValue = sprintf("<em>array</em>(%s)", is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
 304              } elseif ('string'  === $item[0]) {
 305                  $formattedValue = sprintf("'%s'", htmlspecialchars($item[1], ENT_QUOTES | ENT_SUBSTITUTE, $this->charset));
 306              } elseif ('null' === $item[0]) {
 307                  $formattedValue = '<em>null</em>';
 308              } elseif ('boolean' === $item[0]) {
 309                  $formattedValue = '<em>'.strtolower(var_export($item[1], true)).'</em>';
 310              } elseif ('resource' === $item[0]) {
 311                  $formattedValue = '<em>resource</em>';
 312              } else {
 313                  $formattedValue = str_replace("\n", '', var_export(htmlspecialchars((string) $item[1], ENT_QUOTES | ENT_SUBSTITUTE, $this->charset), true));
 314              }
 315   
 316              $result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
 317          }
 318   
 319          return implode(', ', $result);
 320      }
 321  }
 322