2016-03-28 16 views

cevap

8

Eğer (geçerli kullanıcı almak için durumunda @security.context hizmeti) bir dış bağımlılık ile ilgili herhangi bir mantıkla bir nesneyi doğrulamak istiyorsanız ... olmalıdır:

  • bir özel validation- oluşturmak kısıt
  • bir özel doğrulayıcı hizmet oluşturmak
  • doğrulayıcı içine @security.context hizmetini enjekte kısıtlaması tarafından kullanılmak üzere
  • , tüzel

çözüm Validators with Dependencies


This video aşağıdaki RedBull doğrulayıcı sahip olmak kesinlikle gerekli yüzden gösteren belgeler bölümünde açıklanan doğrulamak için bu yeni oluşturulan doğrulama sınırlamayı kullanır.

Modeli/Varlık

use FamilyGuy\Validator\Constraints\Peter as PeterIsNotAllowedToOrder; 

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

yapılandırma

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

Kısıtlama

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'; 
    } 
} 

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

Sen ve herhangi bir dış bağımlılığa karşı doğrulamak için Callback kısıtlamayı kullanmamalısınız olamaz.

herhangi bir doğrulama bağımlılığı doğrudan etki alanı modelinize veya varlıklarınıza enjekte etmeyi denemeyin.

Doğrulama mantığı genel olarak kişilerin takım tutulmalıdır.

Açıklamalar zaten varlıklar ve symfony doğrulayıcı arasındaki yumuşak bağlantı çeşit bulunmaktadır. Bu nedenle, genellikle doktrin ve doğrulama haritalamalarının xml yapılandırmasını kullanmanız önerilir.

+0

Teşekkür ederiz. Ama benim için çalışmıyor. SecurityContextInterface, 2.6'dan beri bir şeyden mahrum görünüyor. Symfony3 kullanıyorum. – rvaliev

+1

Cevabı güncellendi. Symfony 2.6+ ile '@ security.token_storage'' 'security.context' yerine' getToken() 'yöntemini sağlar ... ancak bunu kendiniz çözebilirdiniz.) Eğer cevabım size değerli bilgiler veriyorsa kabul etmeyi veya en azından onu yükseltmeyi düşünebilir. – nifr

+1

Symfony’de yeniyim, bu yüzden kendim çözemedim. Neyse, şimdi çalışıyor! Çok teşekkür ederim! :) – rvaliev

İlgili konular