Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

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

HttpKernel.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 9.86 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\HttpKernel;
013   
014  use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
015  use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
016  use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
017  use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
018  use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
019  use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
020  use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
021  use Symfony\Component\HttpKernel\Event\GetResponseEvent;
022  use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
023  use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
024  use Symfony\Component\HttpKernel\Event\PostResponseEvent;
025  use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException;
026  use Symfony\Component\HttpFoundation\Request;
027  use Symfony\Component\HttpFoundation\RequestStack;
028  use Symfony\Component\HttpFoundation\Response;
029  use Symfony\Component\EventDispatcher\EventDispatcherInterface;
030   
031  /**
032   * HttpKernel notifies events to convert a Request object to a Response one.
033   *
034   * @author Fabien Potencier <fabien@symfony.com>
035   */
036  class HttpKernel implements HttpKernelInterface, TerminableInterface
037  {
038      protected $dispatcher;
039      protected $resolver;
040      protected $requestStack;
041   
042      /**
043       * Constructor.
044       *
045       * @param EventDispatcherInterface    $dispatcher   An EventDispatcherInterface instance
046       * @param ControllerResolverInterface $resolver     A ControllerResolverInterface instance
047       * @param RequestStack                $requestStack A stack for master/sub requests
048       */
049      public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null)
050      {
051          $this->dispatcher = $dispatcher;
052          $this->resolver = $resolver;
053          $this->requestStack = $requestStack ?: new RequestStack();
054      }
055   
056      /**
057       * {@inheritdoc}
058       */
059      public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
060      {
061          $request->headers->set('X-Php-Ob-Level', ob_get_level());
062   
063          try {
064              return $this->handleRaw($request, $type);
065          } catch (\Exception $e) {
066              if ($e instanceof ConflictingHeadersException) {
067                  $e = new BadRequestHttpException('The request headers contain conflicting information regarding the origin of this request.', $e);
068              }
069              if (false === $catch) {
070                  $this->finishRequest($request, $type);
071   
072                  throw $e;
073              }
074   
075              return $this->handleException($e, $request, $type);
076          }
077      }
078   
079      /**
080       * {@inheritdoc}
081       */
082      public function terminate(Request $request, Response $response)
083      {
084          $this->dispatcher->dispatch(KernelEvents::TERMINATE, new PostResponseEvent($this, $request, $response));
085      }
086   
087      /**
088       * @throws \LogicException If the request stack is empty
089       *
090       * @internal
091       */
092      public function terminateWithException(\Exception $exception)
093      {
094          if (!$request = $this->requestStack->getMasterRequest()) {
095              throw new \LogicException('Request stack is empty', 0, $exception);
096          }
097   
098          $response = $this->handleException($exception, $request, self::MASTER_REQUEST);
099   
100          $response->sendHeaders();
101          $response->sendContent();
102   
103          $this->terminate($request, $response);
104      }
105   
106      /**
107       * Handles a request to convert it to a response.
108       *
109       * Exceptions are not caught.
110       *
111       * @param Request $request A Request instance
112       * @param int     $type    The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
113       *
114       * @return Response A Response instance
115       *
116       * @throws \LogicException       If one of the listener does not behave as expected
117       * @throws NotFoundHttpException When controller cannot be found
118       */
119      private function handleRaw(Request $request, $type = self::MASTER_REQUEST)
120      {
121          $this->requestStack->push($request);
122   
123          // request
124          $event = new GetResponseEvent($this, $request, $type);
125          $this->dispatcher->dispatch(KernelEvents::REQUEST, $event);
126   
127          if ($event->hasResponse()) {
128              return $this->filterResponse($event->getResponse(), $request, $type);
129          }
130   
131          // load controller
132          if (false === $controller = $this->resolver->getController($request)) {
133              throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s". The route is wrongly configured.', $request->getPathInfo()));
134          }
135   
136          $event = new FilterControllerEvent($this, $controller, $request, $type);
137          $this->dispatcher->dispatch(KernelEvents::CONTROLLER, $event);
138          $controller = $event->getController();
139   
140          // controller arguments
141          $arguments = $this->resolver->getArguments($request, $controller);
142   
143          // call controller
144          $response = call_user_func_array($controller, $arguments);
145   
146          // view
147          if (!$response instanceof Response) {
148              $event = new GetResponseForControllerResultEvent($this, $request, $type, $response);
149              $this->dispatcher->dispatch(KernelEvents::VIEW, $event);
150   
151              if ($event->hasResponse()) {
152                  $response = $event->getResponse();
153              }
154   
155              if (!$response instanceof Response) {
156                  $msg = sprintf('The controller must return a response (%s given).', $this->varToString($response));
157   
158                  // the user may have forgotten to return something
159                  if (null === $response) {
160                      $msg .= ' Did you forget to add a return statement somewhere in your controller?';
161                  }
162                  throw new \LogicException($msg);
163              }
164          }
165   
166          return $this->filterResponse($response, $request, $type);
167      }
168   
169      /**
170       * Filters a response object.
171       *
172       * @param Response $response A Response instance
173       * @param Request  $request  An error message in case the response is not a Response object
174       * @param int      $type     The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
175       *
176       * @return Response The filtered Response instance
177       *
178       * @throws \RuntimeException if the passed object is not a Response instance
179       */
180      private function filterResponse(Response $response, Request $request, $type)
181      {
182          $event = new FilterResponseEvent($this, $request, $type, $response);
183   
184          $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);
185   
186          $this->finishRequest($request, $type);
187   
188          return $event->getResponse();
189      }
190   
191      /**
192       * Publishes the finish request event, then pop the request from the stack.
193       *
194       * Note that the order of the operations is important here, otherwise
195       * operations such as {@link RequestStack::getParentRequest()} can lead to
196       * weird results.
197       *
198       * @param Request $request
199       * @param int     $type
200       */
201      private function finishRequest(Request $request, $type)
202      {
203          $this->dispatcher->dispatch(KernelEvents::FINISH_REQUEST, new FinishRequestEvent($this, $request, $type));
204          $this->requestStack->pop();
205      }
206   
207      /**
208       * Handles an exception by trying to convert it to a Response.
209       *
210       * @param \Exception $e       An \Exception instance
211       * @param Request    $request A Request instance
212       * @param int        $type    The type of the request
213       *
214       * @return Response A Response instance
215       *
216       * @throws \Exception
217       */
218      private function handleException(\Exception $e, $request, $type)
219      {
220          $event = new GetResponseForExceptionEvent($this, $request, $type, $e);
221          $this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);
222   
223          // a listener might have replaced the exception
224          $e = $event->getException();
225   
226          if (!$event->hasResponse()) {
227              $this->finishRequest($request, $type);
228   
229              throw $e;
230          }
231   
232          $response = $event->getResponse();
233   
234          // the developer asked for a specific status code
235          if ($response->headers->has('X-Status-Code')) {
236              $response->setStatusCode($response->headers->get('X-Status-Code'));
237   
238              $response->headers->remove('X-Status-Code');
239          } elseif (!$response->isClientError() && !$response->isServerError() && !$response->isRedirect()) {
240              // ensure that we actually have an error response
241              if ($e instanceof HttpExceptionInterface) {
242                  // keep the HTTP status code and headers
243                  $response->setStatusCode($e->getStatusCode());
244                  $response->headers->add($e->getHeaders());
245              } else {
246                  $response->setStatusCode(500);
247              }
248          }
249   
250          try {
251              return $this->filterResponse($response, $request, $type);
252          } catch (\Exception $e) {
253              return $response;
254          }
255      }
256   
257      private function varToString($var)
258      {
259          if (is_object($var)) {
260              return sprintf('Object(%s)', get_class($var));
261          }
262   
263          if (is_array($var)) {
264              $a = array();
265              foreach ($var as $k => $v) {
266                  $a[] = sprintf('%s => %s', $k, $this->varToString($v));
267              }
268   
269              return sprintf('Array(%s)', implode(', ', $a));
270          }
271   
272          if (is_resource($var)) {
273              return sprintf('Resource(%s)', get_resource_type($var));
274          }
275   
276          if (null === $var) {
277              return 'null';
278          }
279   
280          if (false === $var) {
281              return 'false';
282          }
283   
284          if (true === $var) {
285              return 'true';
286          }
287   
288          return (string) $var;
289      }
290  }
291