2012-06-24 13 views
8

¿Cómo puedo definir un constructor en el controlador Symfony2? Quiero obtener la información de usuario registrada en todos los métodos de mi controlador. Actualmente, hago algo como esto en cada acción de mi controlador para obtener el usuario conectado.Constructor en el controlador Symfony2

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

quiero hacerlo una vez en un constructor y hacer de este usuario conectado en disponible en todas mis acciones

Respuesta

12

Para una solución general para la ejecución de código antes de cada acción del controlador se puede conectar un detector de eventos para el kernel.controller evento de este modo:

<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> 

Luego, en su BeforeControllerListener va a llegar el controlador para ver si se implementa una interfaz, si lo hace, va a llamar a un método de la interfaz y pasar en el sec contexto urológico.

<?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); 
     } 
    } 
} 

Entonces, todos los controladores que desea tener el usuario siempre está disponible sólo va a poner en práctica esa interfaz y configurar el usuario de este modo:

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(); 
    } 
// .... 
} 

La interfaz no es más que

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

alguien sabe la manera de escribir la config en yaml? usamos yaml, y no sé cómo agregar el 'argumento'. Leo esto: http://symfony.com/doc/current/cookbook/service_container/event_listener.html y sin ayuda obviamente – Toskan

+0

@Toskan puedes hacer algo como: 'arguments: [" @em "," @ some_service "]' – takeit

+0

app.listener.constructor_listener: clase: AppBundle \ EventListener \ ConstructorListener alcance: solicitud argumentos: - {tipo: servicio, id: security.context} tags: - {nombre: kernel.event_listener , evento: kernel.controller, método: onKernelController} http://pastebin.com/NTySb68a – r4ccoon

2

Mi acercamiento a esto fue:

  1. Hacer una interfaz InitializableControllerInterface
  2. Hacer detector de eventos vacío para
 
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. En el controlador de complemento:
 
class ProfileController extends Controller implements 
     InitializableControllerInterface 
{ 
public function __init() 
    { 
$this->user = $security_context->getToken()->getUser(); 
} 

Y usted será capaz de obtener el $ this-> usuario en cada acción.

Saludos

3

estoy RUNNIG un poco tarde, pero en un controlador que sólo puede acceder el usuario:

$this->getUser(); 

debería estar trabajando desde 2,1

Cuestiones relacionadas