2016-11-06 4 views
0

Ich arbeite an einer Symfony2.8-Anwendung, und ich versuche, die ShowAction des ExceptionController zu überschreiben, alles funktioniert gut, außer ich kann den aktuellen angemeldeten Benutzer nicht abrufen, die security.token_storage gibt immer null zurück . security.yaml:Symfony: Benutzerdefiniert ExceptionController

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: bcrypt 
role_hierarchy: 
    ROLE_ADMIN:  ROLE_USER 
    ROLE_SUPER_ADMIN: ROLE_ADMIN 
providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username_email 
firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 
    main: 
     pattern: ^/ 
     form_login: 
      provider: fos_userbundle 
      csrf_provider: security.csrf.token_manager 
      check_path: fos_user_security_check 
      login_path: fos_user_security_login 
      default_target_path: default_security_target 
      use_referer: true 
     logout: 
      path: fos_user_security_logout 
      target: default_security_target   
     anonymous: true 
     remember_me: 
      key: "%secret%" 
      lifetime: 604800 
      path:/
access_control: 
    - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin, role: ROLE_ADMIN } 

und in der Config erklären i den Controller als Dienst unter dem Block Dienstleistungen: twig.controller.exception: class: %twig.controller.exception.class% arguments: ["@twig",%kernel.debug%,"@security.token_storage"] und hier ist mein Controller:

namespace test\testBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference; 
use Symfony\Component\HttpKernel\Exception\FlattenException; 
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as baseController; 
use FOS\UserBundle\Model\UserInterface; 

class ExceptionController extends baseController 
{ 
    private $tokenStorage; 

public function __construct(\Twig_Environment $twig,$debug,TokenStorage $tokenStorage) 
{ 
    parent::__construct($twig,$debug); 
    $this->tokenStorage= $tokenStorage; 
} 
/** 
* Converts an Exception to a Response. 
* 
* @param Request    $request The request 
* @param FlattenException  $exception A FlattenException instance 
* @param DebugLoggerInterface $logger A DebugLoggerInterface instance 
* @param string    $_format The format to use for rendering (html, xml, ...) 
* 
* @return Response 
* 
* @throws \InvalidArgumentException When the exception template does not exist 
*/ 
public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null, $_format = 'html') 
{ 
    /*** $this->securityContext is a pitfall never use it here recommended by the documentation 
     $user = $this->tokenStorage->getToken()->getUser();//$this->tokenStorage->getToken() is always null 

    if (!is_object($user) || !$user instanceof UserInterface) { 
     $user=null; 
    } 

    $currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1)); 
    $code = $exception->getStatusCode(); 
     return new Response($this->twig->render(
      $this->findTemplate($request, $_format, $code, $this->debug), 
      array(
       'status_code' => $code, 
       'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '', 
       'exception'  => $exception, 
       'logger'   => $logger, 
       'currentContent' => $currentContent 
      ) 
     )); 
} 
} 

irgendwelche Vorschläge, bitte!

+2

Fügen Sie den zugehörigen Code hinzu. –

+0

innerhalb der ShowAction rufe ich $ this-> tokenStorage-> getToken(); es gibt null zurück und gibt an, dass der Tokenstorage Service innerhalb des Controllers ist, der Service selbst ist – ZeSoft

+0

@ZeSoft: Nein, was er meinte, war deine Frage mit dem tatsächlichen Code zu aktualisieren. Bitte geben Sie auch Ihre 'security.xml' an - das sollte uns einen Hinweis geben, warum das nicht funktioniert –

Antwort

1

Ich verglich die ursprüngliche ExceptionController Klasse mit Ihrer und es gibt geringfügige Unterschiede, rund um die tokenStorage. Als solches sehe ich nicht viel daran, in die TwigBundle zu hacken, nur um eine Ausnahme abzufangen und die Response bereitzustellen.

Zu diesem Zweck gibt es einen Ereignisaufruf KERNEL_EXCEPTION, auf den Sie hören und, falls erforderlich, tauschen Sie die Response mit Ihren eigenen. Die Seite Events and Event Listeners beschreibt wie.

Also, im Grunde:

  1. Erstellen Sie Ihre eigenen Service und injizieren TokenStorage
  2. Tag mit kernel.exception
  3. In Ihren Diensten, entscheiden, was Sie tun möchten, und setzen bei Bedarf:

    $event->setResponse($myNewResponse); 
    

, die den Trick tun sollten. Hoffe, das hilft ...

+0

Tokenstorage wird injiziert, da ein Code existiert, den ich nicht benutzt habe und der die Informationen des verbundenen Benutzers verwendet. und ich habe bereits die onkernelException verwendet, aber der Benutzer ist auch null, selbst wenn ich die Priorität auf 255 setze, so dass der Code nach der Einstellung des Tokenspeichers ausgeführt wird, aber nichts scheint zu funktionieren – ZeSoft

Verwandte Themen