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.
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
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
Symfony’de yeniyim, bu yüzden kendim çözemedim. Neyse, şimdi çalışıyor! Çok teşekkür ederim! :) – rvaliev