2012-06-24 14 views
8

Wie kann ich einen Konstruktor im Symfony2-Controller definieren. Ich möchte die eingeloggten Benutzerdaten in allen Methoden meines Controllers abrufen, derzeit mache ich so etwas in jeder Aktion meines Controllers um den eingeloggten Benutzer zu bekommen.Konstruktor in Symfony2 Controller

$em = $this->getDoctrine()->getEntityManager("pp_userdata"); 
$user = $this->get("security.context")->getToken()->getUser(); 

Ich möchte in einem Konstruktor es einmal tun und dies auf alle meine Handlungen in Benutzer zur Verfügung

zur Ausführung von Code

Antwort

12

Für eine allgemeine Lösung protokolliert, bevor jeder Controller-Aktion Sie einen Ereignis-Listener die anhängen kernel.controller Ereignis wie folgt:

<service id="your_app.listener.before_controller" class="App\CoreBundle\EventListener\BeforeControllerListener" scope="request"> 
    <tag name="kernel.event_listener" event="kernel.controller" method="onKernelController"/> 
    <argument type="service" id="security.context"/> 
</service> 

Dann in Ihrem BeforeControllerListener werden Sie den Controller überprüfen, um zu sehen, ob es eine Schnittstelle implementiert, wenn es der Fall ist, werden Sie eine Methode aus der Schnittstelle aufrufen und übergeben in der Sekunde Kontext.

<?php 

namespace App\CoreBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 
use Symfony\Component\Security\Core\SecurityContextInterface; 
use App\CoreBundle\Model\InitializableControllerInterface; 

/** 
* @author Matt Drollette <[email protected]> 
*/ 
class BeforeControllerListener 
{ 

    protected $security_context; 

    public function __construct(SecurityContextInterface $security_context) 
    { 
     $this->security_context = $security_context; 
    } 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController(); 

     if (!is_array($controller)) { 
      // not a object but a different kind of callable. Do nothing 
      return; 
     } 

     $controllerObject = $controller[0]; 

     // skip initializing for exceptions 
     if ($controllerObject instanceof ExceptionController) { 
      return; 
     } 

     if ($controllerObject instanceof InitializableControllerInterface) { 
      // this method is the one that is part of the interface. 
      $controllerObject->initialize($event->getRequest(), $this->security_context); 
     } 
    } 
} 

Dann werden alle Controller, die Sie den Benutzer haben wollen immer verfügbar Sie werden nur diese Schnittstelle implementieren und den Benutzer festgelegt wie folgt:

use App\CoreBundle\Model\InitializableControllerInterface; 

class DefaultController implements InitializableControllerInterface 
{ 
    /** 
    * Current user. 
    * 
    * @var User 
    */ 
    private $user; 

    /** 
    * {@inheritdoc} 
    */ 
    public function initialize(Request $request, SecurityContextInterface $security_context) 
    { 
     $this->user = $security_context->getToken()->getUser(); 
    } 
// .... 
} 

Die Schnittstelle ist nichts anderes als

namespace App\CoreBundle\Model; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\SecurityContextInterface; 

interface InitializableControllerInterface 
{ 
    public function initialize(Request $request, SecurityContextInterface $security_context); 
} 
+0

jemand den Weg kennen die schreiben Konfiguration in Yaml? Wir benutzen Yaml, und ich weiß nicht, wie man das 'Argument' hinzufügt. Ich lese dies: http://symfony.com/doc/current/cookbook/service_container/event_listener.html auch ohne Hilfe offensichtlich – Toskan

+0

@Toskan Sie können nur etwas tun wie: 'Argumente: [" @em "," @ some_service "]' – takeit

+0

app.listener.constructor_listener: Klasse: AppBundle \ Eventlistener \ ConstructorListener -umfang: Anfrage Argumente: - {type: Service, ID: security.context} tags: - {name: kernel.event_listener , Ereignis: kernel.controller, Methode: onKernelController} http://pastebin.com/NTySb68a – r4ccoon

2

zu dieser Mein Ansatz war:

  1. Stellen Sie eine leere Schnittstelle InitializableControllerInterface
  2. Make-Ereignis Listener für
 
namespace ACMEBundle\Event; 

use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 

class ControllerConstructor 
{ 
    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController(); 
     if (!is_array($controller)) { 
      // not a object but a different kind of callable. Do nothing 
      return; 
     } 

     $controllerObject = $controller[0]; 
     if ($controllerObject instanceof InitializableControllerInterface) { 
      $controllerObject->__init($event->getRequest()); 
     } 
    } 
} 
  1. In Ihrem Controller hinzufügen:
 
class ProfileController extends Controller implements 
     InitializableControllerInterface 
{ 
public function __init() 
    { 
$this->user = $security_context->getToken()->getUser(); 
} 

Und Sie werden die $ this- bekommen können,> Benutzer in jeder Aktion.

Grüße

3

Ich bin ein bisschen spät Tagrunnig, aber in einem Controller können Sie nur den Benutzer zugreifen:

$this->getUser(); 

arbeiten werden sollte, da 2.1

Verwandte Themen