आप (@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
बाधा किसी भी बाहरी निर्भरता के खिलाफ मान्य करने के लिए उपयोग नहीं करना चाहिए कर सकते हैं।
किसी भी सत्यापन निर्भरता को सीधे अपने डोमेन मॉडल या इकाइयों में इंजेक्ट करने का प्रयास न करें।
प्रमाणीकरण तर्क सामान्य रूप से इकाइयों से बाहर रखा जाना चाहिए।
एनोटेशन पहले से ही इकाइयों और सिम्फनी वैधकर्ता के बीच नरम-युग्मन के कुछ प्रकार हैं। यही कारण है कि सिद्धांत के लिए एक्सएमएल कॉन्फ़िगरेशन का उपयोग करने की अनुशंसा की जाती है- और आमतौर पर सत्यापन-मैपिंग।
धन्यवाद। लेकिन यह मेरे लिए काम नहीं करता है। 2.6 या कुछ के बाद से सुरक्षा कॉन्टेक्स्ट इंटरफेस को बहिष्कृत किया जा रहा है। मैं symfony3 का उपयोग कर रहा हूँ। – rvaliev
उत्तर अद्यतन किया गया। सिम्फनी 2.6+ के साथ '@ security.token_storage'' @ security.context' की बजाय 'getToken()' विधि प्रदान करता है ... लेकिन आप इसे स्वयं समझने में सक्षम हो सकते थे;) यदि मेरा उत्तर आपको मूल्यवान अंतर्दृष्टि प्रदान करता है इसे स्वीकार करने या कम से कम इसे ऊपर उठाने पर विचार कर सकते हैं। – nifr
मैं सिम्फनी के लिए नया हूं, इसलिए मैं इसे अपने आप से नहीं समझ पाया। वैसे भी, यह अब काम करता है !! आपका बहुत बहुत धन्यवाद! :) – rvaliev