2017-07-17 7 views
6

संपादित करें द्वारा क्षेत्र में उपयोग के लिए नहीं बुलाया सत्यापन: यहाँ एक github पूर्ण कोड के साथ समस्या यहSymfony3 प्रपत्र एक मॉडल ट्रांसफार्मर

पुन: पेश करने के लिए मैं निम्नलिखित इकाई

class Place 
{ 
    use Traits\HasId; 

    /** 
    * Used for form. 
    * 
    * @Assert\Image(
    *  mimeTypes = {"image/png", "image/jpeg"}, 
    *  minWidth = 50, 
    *  maxWidth = 1000, 
    *  minHeight = 50, 
    *  maxHeight = 1000, 
    *  maxSize = "1M" 
    *) 
    */ 
    private $imageFile = null; 

    /** 
    * @ORM\OneToOne(targetEntity="MyImage", orphanRemoval=true, cascade={"persist"}) 
    */ 
    protected $image; 

} 

निम्न प्रपत्र के साथ है

class AdminPlaceType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new HasImageTransformer(); 
     $builder->add('imageFile')->addModelTransformer($transformer); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(['data_class' => 'AppBundle\Entity\Place']); 
    } 
} 

और निम्नलिखित मॉडल ट्रांसफार्मर

class HasImageTransformer implements DataTransformerInterface 
{ 
    public function transform($hasImage) 
    { 
     return $hasImage; 
    } 

    /** 
    * reverse transforms. 
    */ 
    public function reverseTransform($hasImage) 
    { 
     $file = $hasImage->getImageFile(); 
     $myImage = new MyImage(); 
     $myImage->setData(file_get_contents($file->getPathName())) 
     $myImage->setMimeType($file->getMimeType()); 

     $hasImage->setImage($myImage); 
    } 
} 

मैं एक सही छवि अपलोड कर सकता हूं, और फॉर्म डेटाबेस में सही ढंग से सहेजा गया है।

लेकिन अगर मैं एक गलत छवि (उदाहरण के लिए एक .txt फ़ाइल) भेजते हैं तो फॉर्म अभी भी डेटाबेस में किसी भी त्रुटि के बिना सहेजा जाता है

लेकिन अगर मैं फार्म से addModelTransformer निकालने के लिए, तो मैं सही मान्यता मिल गया त्रुटि

यह फ़ाइल एक वैध छवि

के रूप में मेरे ट्रांसफार्मर मूल imageFile क्षेत्र संशोधित नहीं करता है, मैं सोच रहा हूँ क्या इस समस्या का कारण बन सकता है नहीं है।

मैं php7 और symfony3.3.4 उपयोग कर रहा हूँ

+0

अद्यतन: मेरी गलती है, सिर्फ देखा है कि आप दो अलग-अलग गुण वहाँ स्थापित कर रहे हैं। '' MyImage' '' Symfony \ Component \ HttpFoundation \ File \ File'' के उत्तराधिकारी है? सिम्फनी की 'छवि वैलिडेटर 'शायद यह नहीं जान सके कि आपकी ऑब्जेक्ट को कैसे संभालना है ताकि यह केवल इसे अनदेखा कर सके। –

+0

असल में "माईमेज" एक वैधता सजावट सेट नहीं है, यह डेटाबेस में इकाई है (कुछ अजीब कारणों से, यह एक ब्लॉब फ़ील्ड में छवि स्टोर है), imageFile फ़ील्ड वह है जिसमें वैधकर्ता है, और इसमें " अपलोड किए गए फॉर्म से अपलोड किया गया फ़ाइल "ऑब्जेक्ट। ट्रांसफॉर्मर अपलोड किए गए फ़ाइल –

+0

से MyImage ऑब्जेक्ट बनाते हैं, मैंने समस्या को पुन: उत्पन्न करने का प्रयास किया, लेकिन मुझे कई त्रुटियां और प्रश्न थे ... सभी फ़ाइलों को लिखने का प्रयास करें, क्योंकि वे पर्याप्त नहीं हैं ... -1 – pooler

उत्तर

4

जवाब वास्तव में बहुत बेवकूफ

कारण यह था कि मैं reverseTransform

/** 
* reverse transforms. 
*/ 
public function reverseTransform($hasImage) 
{ 
    $file = $hasImage->getImageFile(); 
    $myImage = new MyImage(); 
    $myImage->setData(file_get_contents($file->getPathName())) 
    $myImage->setMimeType($file->getMimeType()); 

    $hasImage->setImage($myImage); 
    // this was missing :(
    return $hasImage; 
} 

इस में एक वापसी भूल प्रपत्र मॉडल में पूरी इकाई पैदा कर रहा था के रूप में तब्दील हो गया था "शून्य" लेकिन इकाई को स्वयं नष्ट नहीं किया गया था क्योंकि मैंने अभी भी नियंत्रक में इसका संदर्भ दिया था क्योंकि यह मानक

के माध्यम से बनाया गया था

तो $place सही डेटा युक्त किया गया था, और फार्म होने null यह मान्यता ट्रिगर नहीं कर रहा था ....

+0

मेरे पास एक नियंत्रक के साथ समान बात नहीं थी कुछ भी ... और मैं 'वापसी 'कथन भूल गया। हम सभी को होता है :) –

+0

@ allan.simon कि कोड काम करता है इसका मतलब यह नहीं है कि यह करने का सबसे अच्छा तरीका है। आप एक उद्देश्य के लिए एक फॉर्म ट्रांसफॉर्मर का उपयोग कर रहे हैं जिसका उद्देश्य यह नहीं था। एक ट्रांसफॉर्मर को आउटपुट के रूप में केवल इनपुट को दूसरे प्रारूप में परिवर्तित करना चाहिए। ए - [ट्रांसफॉर्म] -> बी और बी - [इनवर्क्सट्रांसफॉर्म] -> आपका कोड ऐसा नहीं कर रहा है इसलिए इसे बदलने के लिए जोड़ना यह सही जगह नहीं है। आपका कोड ए - [Trasnform] -> ए और ए - [इनवर्क्सट्रांसफॉर्म] -> ए 'तो अगर आपके पास ए है - - [Trasnform] -> ए' ऐसा नहीं है कि इसे कैसे काम करना चाहिए । आप इसे कर सकते हैं, लेकिन मैं सिर्फ आपको यह बताना चाहता हूं कि यह सही नहीं है। – albert

2

आपका ट्रांसफार्मर MyImage संस्था द्वारा एक UploadFile या File वस्तु की जगह है। मुझे लगता है कि आपका MyImageFile या UploadFile विस्तारित नहीं कर रहा है। यह ट्रांसफॉर्मर के लिए इच्छित उपयोग नहीं है। एक ट्रांसफार्मर एक इनपुट को दूसरे प्रकार के इनपुट में बदल देता है।

I ट्रांसफार्मर को हटाने की सिफारिश करेगा और ट्रांसफॉर्मर का कोड Place->setImageFile में जोड़ें। फिर आपके पास छविफाइल सत्यापन अपेक्षित होगा और जब भी आप किसी अन्य फ़ाइल द्वारा छवि को बदलते हैं तो आप फॉर्म का उपयोग नहीं करते समय भी अपने MyImage को फिर से बना देंगे।

तुम सच में ऐसा करने के लिए उस प्रपत्र कोड में और नहीं प्लेस इकाई कोड में आप FormEventshttps://symfony.com/doc/current/form/events.htmlFormEvents :: POST_SET_DATA

+0

मैं प्रतिस्थापित नहीं कर रहा हूं, मैं अपलोडफाइल को एक नए क्षेत्र में बदल रहा हूं, MyImage, I लगता है कि यह करने के लिए यह कैनन तरीका है? (प्रलेखन में उदाहरण इसे एक इकाई में बदलने के लिए एक संख्या लेता है) यानी अपलोडफाइल/फ़ाइल मेरी इकाई की छविफाइल संपत्ति है, और मेरा ट्रांसफॉर्मर छवि फ़ील्ड भाग सेट कर रहा है जो MyImage प्रकार है, इसलिए मेरी इकाई का प्रारंभिक डेटा छुआ नहीं गया है? –

+0

मैंने एक जिथब के लिए एक लिंक जोड़ा है जिसमें पूरी तरह से कार्यात्मक और न्यूनतम कोड है जो –

0

का उपयोग करना चाहिए एक प्रमाणीकरण त्रुटि पैदा करने के लिए चाहते हैं, एक TransformationFailedException फेंक देते हैं। लेकिन आप इस संदेश को जो संदेश भेजते हैं वह उपयोगकर्ता को नहीं दिखाया जाएगा। आप उस संदेश को invalid_message विकल्प के साथ सेट करेंगे (नीचे देखें)। https://symfony.com/doc/current/form/data_transformers.html

+0

समस्या को पुन: उत्पन्न करता है लेकिन मैं इसे फेंक नहीं सकता क्योंकि मेरे ट्रांसफॉर्मर बिंदु से सब ठीक है? मेरी समझ यह है कि यदि आप ट्रांसफॉर्मेशन प्रक्रिया के अनुसार कोई त्रुटि रखते हैं तो आप इस तरह के अपवाद को फेंक देंगे (उदाहरण के लिए यदि आप एक आईडी को एक इकाई को घुमाते हैं और यह अस्तित्व में नहीं है आदि) –

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