2017-09-14 50 views
7

मैं एक बंडल में काम कर रहा हूं जहां उपयोगकर्ता एक फॉर्म का उपयोग करके "हास्य" बनाता है, और मैं यह जांचने की कोशिश कर रहा हूं कि उपयोगकर्ता के पास अभी भी "क्रेडिट" है। तो मैंने एक कस्टम सत्यापनकर्ता बनाया जो पिछले कॉमर्स से पूछताछ करता है और क्रेडिट पर्याप्त नहीं होने पर त्रुटि उत्पन्न करता है।सिम्फनी सत्यापन

मेरी समस्या यह है कि यदि उपयोगकर्ता "दिनांक" फ़ील्ड में गलत प्रारूप के साथ दिनांक सबमिट करता है (यानी 32-13-20122 24:05) सिम्फनी अभी भी मेरी कस्टम सत्यापन चलाने की कोशिश करता है और मुझे सभी प्रकार की त्रुटियां मिलती हैं (क्योंकि $comision->getDate()null है और मान्य दिनांकटाइम ऑब्जेक्ट नहीं है)।

मैं इस त्रुटि हो रही है:

clone method called on non-object

मैं भी देख सकते हैं कि $comision->getDate() का मूल्य अपने कस्टम सत्यापनकर्ता में एक वैध datetime है, लेकिन यह मेरे लिए है कि यह बाद से मैं इस जोड़ा आवश्यक नहीं होना चाहिए लगता है तिथि संपत्ति में नियम।

यह मेरा इकाई (सरलीकृत)

/** 
* @MyValidation\TotalHours() 
*/ 
class Comision 
{ 

/** 
* @ORM\Column(type="datetime") 
* @Assert\DateTime() 
* @Assert\NotNull() 
*/ 
protected $date; 


/** 
* @ORM\Column(type="decimal", nullable=false, scale=1) 
* @Assert\NotBlank() 
*/ 
protected $hours; 

... 

मेरे प्रपत्र वर्ग ...

class NewComisionType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
      $builder 
       ->add('date', DateTimeType::class, array(
       'widget' => 'single_text', 
       'label' => 'Starting date and time', 
       'format' => 'dd/MM/yyyy HH:mm' 
       )) 
       ->add('hours', ChoiceType::class, array(
        'label'=> 'How many hours', 
        'choices' => array(
         '1:00' => 1, 
         '1:30' => 1.5, 
         '2:00' => 2, 
         '2:30' => 2.5, 
         '3:00' => 3 
        ) 
       )) 
... 

और मेरे cutom सत्यापनकर्ता कि पिछले comisions उपयोगकर्ता अभी भी है, तो लगता है की जांच करता है "क्रेडिट"

public function validate($comision, Constraint $constraint) 
{ 
$from = clone $comision->getDate(); 
$from->modify('first day of this month'); 

$to = clone $comision->getDate(); 
$to->modify('last day of this month'); 

$credit = $this->em->getRepository("ComisionsBundle:Comision")->comisionsByDate($comision,$from, $to); 

... 
फिर डेटा ट्रांसफार्मर की जांच में

https://symfony.com/doc/current/form/data_transformers.html

और अगर तिथि मान्य है और नहीं तो एक त्रुटि फेंक:

+0

आप तिथि के लिए सत्यापन क्यों नहीं जोड़ते? https://symfony.com/doc/current/reference/constraints/Date.html या शायद आपके कस्टम सत्यापनकर्ता – kunicmarko20

+0

में मैंने किया (मैं इसे जोड़ने के लिए अपना प्रश्न संपादित कर रहा हूं) लेकिन इसका कोई प्रभाव नहीं है। ऐसा लगता है कि यह सभी सत्यापन नियम चलाता है भले ही डेटा-ट्रांसफॉर्म के बाद कोई वैध डेटाटाइम न हो। –

उत्तर

0

IIRC डेटा सत्यापन से पहले चलाने के ट्रांसफार्मर, आप डेटा ट्रांसफार्मर के साथ अपनी तिथि के लिए जा सकते हैं।

4

docs में वर्णित अनुसार आपकी बाधाओं को समूहित करना एक तरीका होगा।

इस तरह आप बाधाओं के दो समूहों को परिभाषित कर सकते हैं जबकि दूसरा समूह केवल तभी सत्यापित किया जाएगा जब पहले समूह में सभी बाधाएं मान्य हों।

अपने उपयोग के मामले के संबंध में, आप एक कस्टम समूह की तुलना में एक अलग समूह में अपनी कस्टम बाधा डाल सकते हैं यह सुनिश्चित करने के लिए कि आपके पास उचित $ कॉमशन डेटटाइम ऑब्जेक्ट है।

+0

मेरे बारे में बहुत बेहतर समाधान इस बारे में नहीं पता था। धन्यवाद! – kunicmarko20

2

To do this, you can use the GroupSequence feature. In this case, an object defines a group sequence, which determines the order groups should be validated.

https://symfony.com/doc/current/validation/sequence_provider.html

समाधान इस तरह दिखना चाहिए:

/** 
* @MyValidation\TotalHours(groups={"Strict"}) 
* @Assert\GroupSequence({"Comision", "Strict"}) 
*/ 
class Comision 

इस तरह, यह पहले समूह Comision में सभी बाधाओं को मान्य होगा (जो Default समूह के समान है)। केवल तभी यदि उस समूह में सभी बाधाएं वैध हैं, तो दूसरा समूह, Strict, सत्यापित किया जाएगा, सुनिश्चित करें कि $comision->getDate() में DateTime उदाहरण होगा।

+0

यह उत्तर मेरा से अलग कैसे है? – Greg

+0

मुझे खेद है, मैंने मेरा सबमिट करने से पहले आपका जवाब नहीं पढ़ा। – yceruto

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