2012-06-24 20 views
8

मैं सिम्फनी 2 नियंत्रक में एक कन्स्ट्रक्टर को कैसे परिभाषित कर सकता हूं। मैं अपने नियंत्रक के सभी तरीकों से लॉग इन किए गए उपयोगकर्ता डेटा को प्राप्त करना चाहता हूं, वर्तमान में मैं लॉग इन उपयोगकर्ता प्राप्त करने के लिए अपने नियंत्रक की हर कार्रवाई में ऐसा कुछ करता हूं।सिम्फनी 2 नियंत्रक में कन्स्ट्रक्टर

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

मैं एक निर्माता में एक बार यह करना है और इस हर नियंत्रक कार्रवाई आप के लिए एक घटना श्रोता संलग्न कर सकते हैं इससे पहले कि कोड को क्रियान्वित करने के लिए अपने सभी कार्यों

उत्तर

12

एक सामान्य समाधान के लिए पर उपलब्ध उपयोगकर्ता के प्रवेश बनाना चाहते kernel.controller घटना इतनी तरह:

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

फिर अपनी BeforeControllerListener आप नियंत्रक की जाँच करेगा कि क्या यह एक अंतरफलक को लागू करता है, अगर यह होता है, आप इंटरफ़ेस से एक विधि कॉल और सेकंड में पारित करेंगे देखने के लिए परिपक्वता संदर्भ।

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

फिर, किसी भी नियंत्रक कि आप उपयोगकर्ता हमेशा उपलब्ध तो जैसे उपयोगकर्ता है आप सिर्फ इतना है कि इंटरफ़ेस को लागू करेंगे और सेट करना चाहते हैं:

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

इंटरफ़ेस

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

कोई रास्ता लिखने के लिए पता yaml में विन्यास? हम yaml का उपयोग करते हैं, और मुझे नहीं पता कि 'तर्क' कैसे जोड़ना है। मैंने इसे पढ़ा: http://symfony.com/doc/current/cookbook/service_container/event_listener.html साथ ही कोई सहायता नहीं – Toskan

+0

@ टोस्कन आप बस कुछ ऐसा कर सकते हैं: 'तर्क: ["@em", "@ some_service "]' – takeit

+0

app.listener.constructor_listener: वर्ग: AppBundle \ EventListener \ ConstructorListener गुंजाइश: अनुरोध तर्क: - {प्रकार: सेवा, आईडी: security.context} टैग: - {नाम: kernel.event_listener , घटना: kernel.controller, विधि: on कर्नेल नियंत्रक} http://pastebin.com/NTySb68a – r4ccoon

2

मेरा दृष्टिकोण यह था:

 
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. के लिए एक खाली इंटरफ़ेस InitializableControllerInterface
  2. मेक घटना श्रोता करें कि आपके नियंत्रक ऐड में:
 
class ProfileController extends Controller implements 
     InitializableControllerInterface 
{ 
public function __init() 
    { 
$this->user = $security_context->getToken()->getUser(); 
} 

और तुम $ इस- प्राप्त करने में सक्षम हो जाएगा> प्रत्येक कार्रवाई में उपयोगकर्ता।

सादर

3

मैं थोड़ी देर हो चुकी runnig हूँ, लेकिन एक नियंत्रक में आप सिर्फ उपयोगकर्ता पहुँच सकते हैं:

$this->getUser(); 

काम कर दिया जाना चाहिए के बाद से 2.1