2016-03-28 7 views
7

मैं उपयोगकर्ता इकाई के अंदर कॉलबैक का उपयोग कर एक कस्टम सत्यापन कर रहा हूं।Symfony2: वर्तमान में लॉग इन उपयोगकर्ता को ध्यान में रखते हुए किसी इकाई को कैसे सत्यापित करें?

इसलिए मुझे वर्तमान में लॉग इन उपयोगकर्ता का उपयोगकर्ता ऑब्जेक्ट प्राप्त करने की आवश्यकता है।

नियंत्रक में मैं इस तरह यह कर सकते हैं:

$user= $this->get('security.context')->getToken()->getUser(); 

लेकिन मैं इसे कैसे उपयोगकर्ता इकाई के अंदर क्या करना चाहिए?

उत्तर

8

आप (@security.context सेवा आपके मामले में वर्तमान उपयोगकर्ता पाने के लिए) एक बाहरी निर्भरता से संबंधित किसी भी तर्क के साथ एक वस्तु को मान्य करना चाहते हैं ... आप चाहिए:

  • एक कस्टम validation- बनाने बाधा
  • एक कस्टम सत्यापनकर्ता सेवा बनाने बाधा द्वारा प्रयोग की जाने
  • सत्यापनकर्ता में @security.context सेवा इंजेक्षन
  • अपने इकाई

समाधान प्रलेखन अध्याय में वर्णन किया गया है Validators with Dependencies


This video से पता चलता कारण है कि यह निम्नलिखित RedBull सत्यापनकर्ता के लिए बिल्कुल जरूरी है मान्य करने के लिए इस नव निर्मित सत्यापन बाधा का उपयोग करें।

मॉडल/इकाई

use FamilyGuy\Validator\Constraints\Peter as PeterIsNotAllowedToOrder; 

class Order 
{ 
    /** @PeterIsNotAllowedToOrder/RedBull */ 
    public $drink; 

कॉन्फ़िग

# app/config/services.yml 
services: 
    validator.red_bull: 
     class: FamilyGuy\Validator\Constraints\Peter\RedBullValidator 
     # for symfony < 2.6 use @security.context 
     arguments: ["@security.token_storage"] 
     tags: 
      - name: "validator.constraint_validator" 
       alias: "peter_red_bull_constraint_validator" 

बाधा

use Symfony\Component\Validator\Constraint; 

namespace FamilyGuy\Validator\Constraints\Peter; 

/** 
* @Annotation 
*/ 
class RedBull extends Constraint 
{ 
    /** @var string */ 
    public $message = 'Peter... You are not allowed to order %drink%.'; 

    /** @return string */ 
    public function validatedBy() 
    { 
     // has to match the validator service's alias ! 
     return 'peter_red_bull_constraint_validator'; 
    } 
} 

सत्यापनकर्ता:

// For symfony < 2.6 use SecurityContextInterface 
// use Symfony\Component\Security\Core\SecurityContextInterface; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\ConstraintValidator; 

namespace FamilyGuy\Validator\Constraints\Peter; 

class RedBullValidator extends ConstraintValidator 
{ 

    /** @var TokenStorageInterface|SecurityContextInterface */ 
    protected $tokenStorage; 

    /** @param TokenStorageInterface|SecurityContextInterface $token_storage */ 
    public function __construct(TokenStorageInterface $token_storage) 
    { 
     $this->tokenStorage = $token_storage; 
    } 

    public function validate($drink, Constraint $constraint) 
    { 
     $currentUser = $this->tokenStorage->getToken()->getUser()->getName(); 

     if ($currentUser !== "Peter") { 
      return; 
     } 

     if ($drink !== "RedBull") { 
      return 
     } 

     $this->context->buildViolation($constraint->message) 
      ->setParameter('%drink%', $drink) 
      ->addViolation() 
     ; 
    } 

आप नहीं है और आप Callback बाधा किसी भी बाहरी निर्भरता के खिलाफ मान्य करने के लिए उपयोग नहीं करना चाहिए कर सकते हैं।

किसी भी सत्यापन निर्भरता को सीधे अपने डोमेन मॉडल या इकाइयों में इंजेक्ट करने का प्रयास न करें।

प्रमाणीकरण तर्क सामान्य रूप से इकाइयों से बाहर रखा जाना चाहिए।

एनोटेशन पहले से ही इकाइयों और सिम्फनी वैधकर्ता के बीच नरम-युग्मन के कुछ प्रकार हैं। यही कारण है कि सिद्धांत के लिए एक्सएमएल कॉन्फ़िगरेशन का उपयोग करने की अनुशंसा की जाती है- और आमतौर पर सत्यापन-मैपिंग।

+0

धन्यवाद। लेकिन यह मेरे लिए काम नहीं करता है। 2.6 या कुछ के बाद से सुरक्षा कॉन्टेक्स्ट इंटरफेस को बहिष्कृत किया जा रहा है। मैं symfony3 का उपयोग कर रहा हूँ। – rvaliev

+1

उत्तर अद्यतन किया गया। सिम्फनी 2.6+ के साथ '@ security.token_storage'' @ security.context' की बजाय 'getToken()' विधि प्रदान करता है ... लेकिन आप इसे स्वयं समझने में सक्षम हो सकते थे;) यदि मेरा उत्तर आपको मूल्यवान अंतर्दृष्टि प्रदान करता है इसे स्वीकार करने या कम से कम इसे ऊपर उठाने पर विचार कर सकते हैं। – nifr

+1

मैं सिम्फनी के लिए नया हूं, इसलिए मैं इसे अपने आप से नहीं समझ पाया। वैसे भी, यह अब काम करता है !! आपका बहुत बहुत धन्यवाद! :) – rvaliev

संबंधित मुद्दे