2013-04-13 28 views
11

त्रुटि पृष्ठ/404 के बजाय मैं बस/साइटमैप पृष्ठ दिखाना चाहता हूं। बेशक मैं एक रीडायरेक्ट नहीं चाहता हूं और मैं अभी भी 404 HTTP प्रतिक्रिया शीर्षलेख सेट करना चाहता हूं।त्रुटि पृष्ठ (404) के बजाय एक विशिष्ट मार्ग दिखाएं - Symfony2

क्या यह संभव है? मैं देख सकता हूं कि टिग में टेम्पलेट कैसे सेट करें।

मैं निश्चित रूप से एक रीडायरेक्ट नहीं चाहता हूं।

उत्तर

17

के रूप में दिखाया गया है the Symfony Cookbook आप दो तरह से त्रुटि पृष्ठों ओवरराइड कर सकते हैं:

  • ओवरराइड टेम्पलेट्स
  • एक कस्टम अपवाद नियंत्रक

का उपयोग करके आप केवल पर /sitemap मार्ग दिखाना चाहते हैं एक 404 (HttpNotFoundException) अपवाद आप app/Resources/TwigBundle/views/Exception/error404.html.twig में एक नया टेम्पलेट बनाकर ट्विग अपवाद टेम्पलेट को ओवरराइड कर सकते हैं।

कुकबुक में नहीं दिखाया गया एक और तरीका एक ईवेंट श्रोता का उपयोग कर रहा है। जब कर्नेल को अपवाद का सामना करना पड़ता है, तो kernel.exception ईवेंट प्रेषित किया जाता है। डिफ़ॉल्ट रूप से, यह अपवाद टिग द्वारा प्रदान किए गए अपवाद सुनकर पकड़ा जाता है। आप कर सकते हैं create your own event listener जो kernel.exception घटना के लिए सुनता है और एक पेज renders:

<?php 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
use Symfony\Component\HttpFoundation\Response; 

public function onKernelException(GetResponseForExceptionEvent $event) 
{ 
    if ($event->getException() instanceof NotFoundHttpException) { 
     $response = $this->templating->renderResponse(/* sitemap */); 

     $event->setResponse($response) 
    } 
} 

(ताकि आप इसे अपने आप को प्रयास करना चाहिए मैं इस कोड का परीक्षण नहीं किया, और तुम घटना श्रोता अपने आप में templating सेवा इंजेक्षन करने के लिए है! , बेशक)।

+0

धन्यवाद, घटना श्रोता मुझे लगता है कि जाने का तरीका है, लेकिन $ यह-> templating मान्य नहीं है। मैंने $ event-> templating भी कोशिश की है। मुझे नहीं लगता कि सामान्य नियंत्रक विधियां उपलब्ध हैं। मुझे एक अपरिभाषित संपत्ति मिलती है: सिम्फनी \ घटक \ Http कर्नेल \ Event \ GetResponseForExceptionEvent :: $ templating ... – user2143356

+0

आप सही हैं, सामान्य नियंत्रक विधियां उपलब्ध नहीं हैं क्योंकि वे सेवाओं पर विधि कॉल के लिए उपनाम हैं। आपको ईवेंट विवरण में ईवेंट श्रोता में 'templating' सेवा इंजेक्ट करना चाहिए। –

+0

उस समय मैं यथार्थवादी नहीं था, यह वास्तव में एक टवीग टेम्पलेट सेट करता है, वास्तव में एक पृष्ठ या नियंत्रक नहीं। – user2143356

0

मेरे पास कई सिम्फनी 3 बंडलों द्वारा रचित एक साधारण वेब ऐप है, जिनके नियंत्रक बेसकंट्रोलर का विस्तार करते हैं। मेरे पास एक AdminBundle भी है। हर नहीं विद्यमान यूआरएल के लिए दिए गए पृष्ठ दिखाने के लिए, मैं काट दिया (और सरल बनाया) मूल ExceptionController.php (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(); 
    } 
} 

मैं के रूप में मैं इसे पसंद किया मेरी त्रुटि टेम्पलेट परिभाषित करते हैं।

मैं

twig: 
    exception_controller: MyappAdminBundle:Exception:show 

ps मुझे यकीन है कि मेरे कोड सुधार किया जा सकता हूँ config.yml भीतर निम्न पंक्ति जोड़ने की जरूरत है, लेकिन यह ठीक काम करता है।

संबंधित मुद्दे