2013-04-15 6 views
0
namespace etc... 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Bundle\TwigBundle\Controller\ExceptionController; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\HttpKernel; 
use Symfony\Component\HttpKernel\Exception\FlattenException; 
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; 
use Symfony\Component\HttpFoundation\Response; 

class MyExceptionController extends ExceptionController 
{ 
    public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null, $format = 'html') 
    { 


    } 
} 

Ничегонеделания внутри контроллера возвращает "неперехваченное исключение 'Symfony \ Component \ Routing \ Exception \ ResourceNotFoundException' в ..." ошибке. Не уверен, правильно ли это, или если это еще одна проблема. Я ожидаю, что это просто обычное действие.Не удается получить Exception контроллер работает - Symfony2

Мне просто нужно сделать это, чтобы он показывал указанный маршрут точно так, как если бы я пошел на сайт domain.com/page.

Я попытался это:

$httpKernel = $this->container->get('kernel'); 
    $response = $httpKernel->forward('AcmeMyBundle:Default:pageAction'); 
    $this->setResponse(new Response($response)); 

... но получаю эту ошибку:

Call to a member function get() on a non-object in... 
+0

'вызов функции член Get() на не-объект в' является типичным случаем, когда вы вызываете функцию на' $ что-то 'который должен быть объектом, но вместо этого является" null ". Пожалуйста, дайте нам более полное сообщение, чтобы помочь. – MatRt

+0

Просто проигнорируйте это. Мне просто нужно знать, как получить доступ к $ controller-> forward в контроллере исключения. $ this-> container-> get() явно не работает. – user2143356

ответ

3

Ваш код похож на то, что я сделал вчера. Я хотел получить все исключение NotFoundHttpException и попытаться перенаправить их на контроллер по умолчанию. Я достиг этого с помощью прослушивателя исключения, как это:

<?php 

namespace Acme\MyBundle\Listener; 

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 

class NotFoundHttpExceptionListener 
{ 
    protected $container; 

    public function setContainer($container) 
    { 
     $this->container = $container; 
    } 

    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     $exception = $event->getException(); 
     if ($exception instanceof NotFoundHttpException) { 
      $httpKernel = $this->container->get('http_kernel'); 

      $response = $httpKernel->forward(
       'AcmeMyBundle:Controller:action', 
       array(
        'uri' => $_SERVER['REQUEST_URI'], 
       ) 
      ); 

      $response->headers->set('X-Status-Code', '200'); 
      $event->setResponse($response); 
      $event->stopPropagation(); 
     } 
    } 
} 

Заметим, что X-Status-Code необходимо, если вы хотите, чтобы вернуть еще один код состояния, чем 404, так как метод handleException в HttpKernel будет использовать это, чтобы установить окончательный статус кода и удаляет его из раздела заголовка.

Моя services.yml выглядит примерно так:

notfoundhttp.exception.listener: 
    class: Acme\MyBundle\Listener\NotFoundHttpExceptionListener 
    calls: 
    - [ setContainer, [@service_container] ] 
    tags: 
    - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 
+0

Метод «вперед» на http_kernel устарел. Есть идеи? –

+0

Хорошо, так как метод «forward» фактически не рекомендуется, вы можете сделать ответ таким образом: $ url = $ this-> container-> get ('router') -> generate ('main_homepage'); $ response = new \ Symfony \ Component \ HttpFoundation \ RedirectResponse ($ url); –

Смежные вопросы