diff -r 000000000000 -r 7f95f8617b0b vendor/symfony/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/symfony/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php Sat Sep 24 15:40:41 2011 +0200 @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\TwigBundle\Controller; + +use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference; +use Symfony\Component\DependencyInjection\ContainerAware; +use Symfony\Component\HttpKernel\Exception\FlattenException; +use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; +use Symfony\Component\HttpFoundation\Response; + +/** + * ExceptionController. + * + * @author Fabien Potencier + */ +class ExceptionController extends ContainerAware +{ + /** + * Converts an Exception to a Response. + * + * @param FlattenException $exception A FlattenException instance + * @param DebugLoggerInterface $logger A DebugLoggerInterface instance + * @param string $format The format to use for rendering (html, xml, ...) + * + * @throws \InvalidArgumentException When the exception template does not exist + */ + public function showAction(FlattenException $exception, DebugLoggerInterface $logger = null, $format = 'html') + { + $this->container->get('request')->setRequestFormat($format); + + // the count variable avoids an infinite loop on + // some Windows configurations where ob_get_level() + // never reaches 0 + $count = 100; + $currentContent = ''; + while (ob_get_level() && --$count) { + $currentContent .= ob_get_clean(); + } + + $templating = $this->container->get('templating'); + $code = $exception->getStatusCode(); + + $response = $templating->renderResponse( + $this->findTemplate($templating, $format, $code, $this->container->get('kernel')->isDebug()), + array( + 'status_code' => $code, + 'status_text' => Response::$statusTexts[$code], + 'exception' => $exception, + 'logger' => $logger, + 'currentContent' => $currentContent, + ) + ); + + $response->setStatusCode($code); + $response->headers->replace($exception->getHeaders()); + + return $response; + } + + protected function findTemplate($templating, $format, $code, $debug) + { + $name = $debug ? 'exception' : 'error'; + if ($debug && 'html' == $format) { + $name = 'exception_full'; + } + + // when not in debug, try to find a template for the specific HTTP status code and format + if (!$debug) { + $template = new TemplateReference('TwigBundle', 'Exception', $name.$code, $format, 'twig'); + if ($templating->exists($template)) { + return $template; + } + } + + // try to find a template for the given format + $template = new TemplateReference('TwigBundle', 'Exception', $name, $format, 'twig'); + if ($templating->exists($template)) { + return $template; + } + + // default to a generic HTML exception + $this->container->get('request')->setRequestFormat('html'); + + return new TemplateReference('TwigBundle', 'Exception', $name, 'html', 'twig'); + } +}