Вход Регистрация
Файл: symfony-2.7/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
Строк: 207
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyBundleTwigBundleController;

use 
SymfonyBundleFrameworkBundleTemplatingTemplateReference;
use 
SymfonyComponentHttpKernelExceptionFlattenException;
use 
SymfonyComponentHttpKernelLogDebugLoggerInterface;
use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentHttpFoundationResponse;
use 
SymfonyComponentTemplatingTemplateReferenceInterface;

/**
 * ExceptionController renders error or exception pages for a given
 * FlattenException.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Matthias Pigulla <mp@webfactory.de>
 */
class ExceptionController
{
    protected 
$twig;

    
/**
     * @var bool Show error (false) or exception (true) pages by default.
     */
    
protected $debug;

    public function 
__construct(Twig_Environment $twig$debug)
    {
        
$this->twig $twig;
        
$this->debug $debug;
    }

    
/**
     * Converts an Exception to a Response.
     *
     * A "showException" request parameter can be used to force display of an error page (when set to false) or
     * the exception page (when true). If it is not present, the "debug" value passed into the constructor will
     * be used.
     *
     * @param Request              $request   The request
     * @param FlattenException     $exception A FlattenException instance
     * @param DebugLoggerInterface $logger    A DebugLoggerInterface instance
     *
     * @return Response
     *
     * @throws InvalidArgumentException When the exception template does not exist
     */
    
public function showAction(Request $requestFlattenException $exceptionDebugLoggerInterface $logger null)
    {
        
$currentContent $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
        
$showException $request->attributes->get('showException'$this->debug); // As opposed to an additional parameter, this maintains BC

        
$code $exception->getStatusCode();

        return new 
Response($this->twig->render(
            
$this->findTemplate($request$request->getRequestFormat(), $code$showException),
            array(
                
'status_code' => $code,
                
'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
                
'exception' => $exception,
                
'logger' => $logger,
                
'currentContent' => $currentContent,
            )
        ));
    }

    
/**
     * @param int $startObLevel
     *
     * @return string
     */
    
protected function getAndCleanOutputBuffering($startObLevel)
    {
        if (
ob_get_level() <= $startObLevel) {
            return 
'';
        }

        
Response::closeOutputBuffers($startObLevel 1true);

        return 
ob_get_clean();
    }

    
/**
     * @param Request $request
     * @param string  $format
     * @param int     $code          An HTTP response status code
     * @param bool    $showException
     *
     * @return TemplateReferenceInterface
     */
    
protected function findTemplate(Request $request$format$code$showException)
    {
        
$name $showException 'exception' 'error';
        if (
$showException && 'html' == $format) {
            
$name 'exception_full';
        }

        
// For error pages, try to find a template for the specific HTTP status code and format
        
if (!$showException) {
            
$template = new TemplateReference('TwigBundle''Exception'$name.$code$format'twig');
            if (
$this->templateExists($template)) {
                return 
$template;
            }
        }

        
// try to find a template for the given format
        
$template = new TemplateReference('TwigBundle''Exception'$name$format'twig');
        if (
$this->templateExists($template)) {
            return 
$template;
        }

        
// default to a generic HTML exception
        
$request->setRequestFormat('html');

        return new 
TemplateReference('TwigBundle''Exception'$showException 'exception_full' $name'html''twig');
    }

    
// to be removed when the minimum required version of Twig is >= 2.0
    
protected function templateExists($template)
    {
        
$loader $this->twig->getLoader();
        if (
$loader instanceof Twig_ExistsLoaderInterface) {
            return 
$loader->exists($template);
        }

        try {
            
$loader->getSource($template);

            return 
true;
        } catch (
Twig_Error_Loader $e) {
        }

        return 
false;
    }
}
Онлайн: 0
Реклама