<?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 Symfony\Component\HttpKernel\Controller; 
 
use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\Exception\HttpException; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
 
/** 
 * Renders error or exception pages from a given FlattenException. 
 * 
 * @author Yonel Ceruto <yonelceruto@gmail.com> 
 * @author Matthias Pigulla <mp@webfactory.de> 
 */ 
class ErrorController 
{ 
    private $kernel; 
    private $controller; 
    private $errorRenderer; 
 
    public function __construct(HttpKernelInterface $kernel, $controller, ErrorRendererInterface $errorRenderer) 
    { 
        $this->kernel = $kernel; 
        $this->controller = $controller; 
        $this->errorRenderer = $errorRenderer; 
    } 
 
    public function __invoke(\Throwable $exception): Response 
    { 
        $exception = $this->errorRenderer->render($exception); 
 
        return new Response($exception->getAsString(), $exception->getStatusCode(), $exception->getHeaders()); 
    } 
 
    public function preview(Request $request, int $code): Response 
    { 
        /* 
         * This Request mimics the parameters set by 
         * \Symfony\Component\HttpKernel\EventListener\ErrorListener::duplicateRequest, with 
         * the additional "showException" flag. 
         */ 
        $subRequest = $request->duplicate(null, null, [ 
            '_controller' => $this->controller, 
            'exception' => new HttpException($code, 'This is a sample exception.'), 
            'logger' => null, 
            'showException' => false, 
        ]); 
 
        return $this->kernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST); 
    } 
}