2012-06-24 49 views
8

Symfony2 denetleyicisinde bir yapıcıyı nasıl tanımlayabilirim. Oturum açmış olan kullanıcı verilerini denetleyicimin tüm yöntemlerinde kullanılabilir hale getirmek istiyorum. Şu anda oturum açmış olan kullanıcıyı almak için denetleyicimin her eyleminde böyle bir şey yapıyorum. Oluşturucu

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

Bir yapıcı içinde bir kere yapmak ve bu bir olay dinleyicisi ekleyebilirsiniz her denetleyici eylem öncesi kodunu uygulamaya yönelik genel çözüm için bütün eylemler

cevap

12

geçerli kullanıcı giriş yapmış olmak için kernel.controller olay şöyle: Sonra

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

yılında senin BeforeControllerListener bunu eğer olursa, sen arayüzünden bir yöntemini çağırın ve sn geçecek bir arabirim uygulayan olmadığını görmek için denetleyiciye kontrol edecek Üreme bağlamı. Sonra

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

, bunu gibi kullanıcıyı sadece o arabirimini uygulayacak her zaman kullanılabilir kullanıcı var ve ayarlamak istediğiniz denetleyicileri:

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

arayüzü

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); 
} 
başka bir şey değildir buna
+0

birisi yazma yolunu biliyor beri

$this->getUser(); 

çalışma olmalı yaml yapılandırmak? yaml kullanıyoruz ve 'argümanı' nasıl ekleyeceğimi bilmiyorum. Bunu okuduğum gibi: http://symfony.com/doc/current/cookbook/service_container/event_listener.html de hiçbir yardım almadan açıkçası – Toskan

+0

@Toskan gibi bir şey yapabilirsiniz: 'arguments: [" @em "," @ some_service "]' – takeit

+0

app.listener.constructor_listener: sınıfı: AppBundle \ EventListener \ ConstructorListener kapsamı: istek argümanlar: - {türü: hizmet, id: security.context} etiketler: - {name: kernel.event_listener , olay: kernel.controller, yöntem: onKernelController} http://pastebin.com/NTySb68a – r4ccoon

2

Benim yaklaşımım vardı:

  1. Denetleyiciniz eklenti olarak
 
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. için boş Arayüz InitializableControllerInterface
  2. Yap olay Dinleyici olun:
 
class ProfileController extends Controller implements 
     InitializableControllerInterface 
{ 
public function __init() 
    { 
$this->user = $security_context->getToken()->getUser(); 
} 

Ve $ this- almak mümkün olacak> her eylemde kullanıcı.

Selamlar

3

biraz geciktim runnig değilim, ama bir denetleyici içinde sadece kullanıcıyı erişebilirsiniz: 2.1