Ich habe eine einfache Web-App, die aus mehreren Symfony3-Bundles besteht, deren Controller einen BaseController erweitern. Ich habe auch einen AdminBundle. Um eine bestimmte Seite für jede nicht existente URL zu zeigen, gehackt ich (und einfacher gemacht) das Original ExceptionController.php (vom TwigBundle):
<?php
namespace MyApp\AdminBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use MyApp\Controller\BaseController;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
class ExceptionController extends BaseController
{
/**
* Converts an Exception to a Response.
*
* @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 $request, FlattenException $exception, DebugLoggerInterface $logger = null)
{
$currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
$code = $exception->getStatusCode();
return $this->render('MyappAdminBundle:Admin:error.html.twig',
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 + 1, true);
return ob_get_clean();
}
}
ich meinen Fehler Vorlage definieren, wie ich wollte.
Ich brauche die folgende Zeile in config.yml
twig:
exception_controller: MyappAdminBundle:Exception:show
ps Ich bin sicher, dass mein Code verbessert werden kann hinzufügen, aber es funktioniert gut.
Danke, der Event-Listener ist der Weg zu gehen, denke ich, aber $ this-> Templating ist nicht gültig. Ich habe auch versucht $ Event-> Templating. Ich denke nicht, dass übliche Controller-Methoden verfügbar sind. Ich bekomme eine nicht definierte Eigenschaft: Symfony \ Component \ HttpKernel \ Event \ GetResponseForExceptionEvent :: $ Templating in ... – user2143356
Sie haben Recht, die üblichen Controller-Methoden sind nicht verfügbar, da diese Aliasnamen für Methodenaufrufe auf Services sind. Sie sollten den Dienst "Templating" in der Ereignisbeschreibung selbst in den Ereignis-Listener einfügen. –
Ich habe zu dieser Zeit keine Realisten gemacht, das setzt nur eine Twig-Vorlage, keine tatsächliche Seite oder Controller. – user2143356