2017-02-15 10 views
18

के लिए एक्सेस प्रकार निर्धारित नहीं कर सका this tutorial के अनुसार फ़ॉर्म में Tag रूपों का संग्रह एम्बेड करने का प्रयास कर रहा हूं। Tag और Service इकाइयों में कई से अधिक संबंध हैं।प्रपत्रों का संग्रह एम्बेड करें त्रुटि:

फॉर्म सही ढंग से प्रस्तुत कर रहा है। लेकिन जब मैं फॉर्म जमा करता हूं, तो मुझे

Could not determine access type for property "tagList"

त्रुटि मिलती है। मुझे समझ में नहीं आता कि ऑब्जेक्ट Service क्लास में addTag() विधि को कॉल करके क्यों नहीं जोड़ा गया है।

ServiceType

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('title', TextType::class, array(
      'label' => 'Title' 
     )) 
    ; 

    $builder->add('tagList', CollectionType::class, array(
     'entry_type' => TagType::class, 
     'allow_add' => true, 
     'allow_delete' => true, 
     'by_reference' => false 
    ))); 
} 

सेवा वर्ग

{ 
.... 
/** 
* @ORM\ManyToMany(targetEntity="Tag", mappedBy="serviceList",cascade={"persist"}) 
*/ 
private $tagList; 

/** 
* @return ArrayCollection 
*/ 
public function getTagList() 
{ 
    return $this->tagList; 
} 

/** 
* @param Tag $tag 
* @return Service 
*/ 
public function addTag(Tag $tag) 
{ 
    if ($this->tagList->contains($tag) == false) { 
     $this->tagList->add($tag); 
     $tag->addService($this); 
    } 
} 

/** 
* @param Tag $tag 
* @return Service 
*/ 
public function removeTag(Tag $tag) 
{ 
    if ($this->tagList->contains($tag)) { 
     $this->tagList->removeElement($tag); 
     $tag->removeService($this); 
    } 
    return $this; 
} 
} 

टैग वर्ग

{ 
    /** 
* @ORM\ManyToMany(targetEntity="Service", inversedBy="tagList") 
* @ORM\JoinTable(name="tags_services") 
*/ 
private $serviceList; 
/** 
* @param Service $service 
* @return Tag 
*/ 
public function addService(Service $service) 
{ 
    if ($this->serviceList->contains($service) == false) { 
     $this->serviceList->add($service); 
     $service->addTag($this); 
    } 
    return $this; 
} 

/** 
* @param Service $service 
* @return Tag 
*/ 
public function removeService(Service $service) 
{ 
    if ($this->serviceList->contains($service)) { 
     $this->serviceList->removeElement($service); 
     $service->removeTag($this); 
    } 
    return $this; 
} 
} 

ServiceController

public function newAction(Request $request) 
{ 
    $service = new Service(); 
    $form = $this->createForm('AppBundle\Form\ServiceType', $service); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($service); 
     $em->flush(); 

     return $this->redirectToRoute('service_show', array('id' => $service->getId())); 
    } 

    return $this->render('AppBundle:Service:new.html.twig', array(
     'service' => $service, 
     'form' => $form->createView(), 
    )); 
} 
+0

http://stackoverflow.com/questions/41213014/could-not-determine-access -type-for-property-file – craigh

+0

यहां असफल परीक्षण है जो त्रुटि उत्पन्न करता है, शायद इसे समझने में सहायता मिलेगी: https://github.com/symfony/property-access/blob/master/Tests/PropertyAccessorCollectionTest.php#L151 – craigh

+0

@craigh अगर मैं 'mapped => false' करता हूं, तो मैं 'टैगलिस्ट' को संपादित नहीं कर पाऊंगा, क्योंकि यह लिखेगा, लेकिन – blahblah

उत्तर

4

क्या आप इस यूआरएल से कोड को लागू करने का प्रयास कर सकते हैं?

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#owning-and-inverse-side-on-a-manytomany-association

पहले, मैप किए गए/उलटा पक्षों को बदलने की कोशिश, और Tag::addService विधि से $service->addTag($this); को निकाल दें।

2

शायद समस्या यह है कि सिम्फनी उस संपत्ति तक नहीं पहुंच सकता है?

तुम कहाँ है कि अपवाद फेंक दिया जाता है (PropertyAccessor कक्षा में writeProperty विधि) को देखें, तो यह कहना है कि वह फेंक दिया जा सकता है:

If the property does not exist or is not public.

ट्यूटोरियल आप इसे संपत्ति $ टैग, और विधि addTag है उल्लेख किया है। मैं बस अनुमान लगा रहा हूं, लेकिन शायद एक सम्मेलन है जहां यह विधि नाम add($singularForm) पर कॉल करने का प्रयास करता है और यह आपके लिए असफल रहा है क्योंकि संपत्ति tagList है और विधि addTag है।

मैं 100% निश्चित नहीं हूं, लेकिन आप सिम्फनी विधि में स्टॉप पॉइंट सेट करके डीबगिंग करने का प्रयास कर सकते हैं यह देखने के लिए कि इसे क्यों फेंक दिया जा रहा है।

1

शायद आप $सेवा वर्ग और टैग क्लास में $ टैगलिस्ट और $ सेवा प्रारंभ करने के लिए भूल गए हैं?

$this->tagList = new ArrayCollection();

$this->serviceList = new ArrayCollection();

+0

मान नहीं पढ़ेगा! नहीं, मैं कक्षा रचनाकारों में टैग और सेवा सूचियों को शुरू करने के बारे में नहीं भूल गया – blahblah

1

यह आपके निर्माता के साथ एक त्रुटि की तरह लगता है। इसे आज़माएं:

public function __construct() 
{ 
    $this-> tagList = new \Doctrine\Common\Collections\ArrayCollection(); 
} 
+0

हैलो! नहीं, मैं कक्षा रचनाकारों में टैग और सेवा सूचियों को प्रारंभ करने के बारे में नहीं भूल गया क्योंकि ArrayCollection() – blahblah

1

यह एक लंबा शॉट है, लेकिन आपकी टिप्पणियों को देखते हुए मुझे लगता है कि समस्या आपके कई रिश्तेदारों से संबंधित हो सकती है। स्वामित्व की तरफ और विपरीत पक्ष (रिश्ते को स्वैप करें) को बदलने की कोशिश करें, जब तक आपको विशेष रूप से दोनों सिरों से अपडेट करने की आवश्यकता न हो (उस स्थिति में मुझे लगता है कि एकमात्र समाधान ऑब्जेक्ट्स को मैन्युअल रूप से जोड़ना या एक से अधिक रिश्ते का उपयोग करना है)।

Changes made only to the inverse side of an association are ignored. Make sure to update both sides of a bidirectional association (or at least the owning side, from Doctrine’s point of view)

इस सिद्धांत से संबंधित एक समस्या मैं पहले का सामना करना पड़ा है, देखें: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork-associations.html

2

लघु संस्करण:

मैं सिर्फ इस समस्या का सामना किया और के लिए एक सेटर जोड़कर इसे हल प्रभावित संपत्ति:

Could not determine access type for property "tagList"

public function setTagList(Array $tagList) 
{ 
    $this->tagList = $tagList; 
} 

लांग संस्करण:

त्रुटि संदेश संकेत दे रहा है कि Symfony वस्तु की स्थिति संशोधित करने की कोशिश कर रहा है, लेकिन समझ नहीं कैसे वास्तव में परिवर्तन करने की वजह से जिस तरह से अपने वर्ग की स्थापना की है करने के लिए।

Taking a look at Symfony's internals, हम देख सकते हैं कि Symfony आप 5 संभावना यह पहुँच प्रदान करने देता है और ऊपर से नीचे तक इस क्रम में सबसे अच्छा एक उठाता है:

  1. एक सेटर विधि एक तर्क के साथ setProperty() नामित:

यह पहली बात है सिम्फनी जांचता है और इसे प्राप्त करने का सबसे स्पष्ट तरीका है।

करना अत्यंत आवश्यक है:

class Entity { 

    protected $tagList; 

    //... 

    public function getTagList() 
    { 
     return $this->tagList; 
    } 

    //... 
} 
एक तर्क के साथ
  1. एक संयुक्त गेटर और सेटर एक विधि में: जहाँ तक मुझे पता है कर रहा हूँ इस सबसे अच्छा अभ्यास है एहसास है कि ऑब्जेक्ट की स्थिति प्राप्त करने के लिए इस विधि को सिम्फनी द्वारा भी एक्सेस किया जाएगा। चूंकि उन विधि कॉल में तर्क शामिल नहीं है, इसलिए इस विधि में तर्क वैकल्पिक होना चाहिए।

    class Entity { 
    
        protected $tagList; 
    
        //... 
    
        public function tagList($tags = null) 
        { 
         if($reps){ 
          $this->tagList = $tags; 
         } else { 
          return $this->tagList; 
         } 
        } 
    
        //... 
    } 
    
    1. प्रभावित संपत्ति घोषित की जा रही सार्वजनिक रूप:

      class Entity { 
      
          public $tagList; 
          //... other properties here 
      } 
      
    2. एक __set जादू विधि:

    यह सभी गुण को प्रभावित करेगा सिर्फ आपके इच्छित व्यक्ति के बजाए।

    class Entity { 
    
        public $tagList; 
    
        //... 
    
        public function __set($name, $value){ 
         $this->$name = $value; 
        } 
        //... 
    } 
    
    1. एक __call जादू विधि (कुछ मामलों में):

    मैं इस बात की पुष्टि करने में सक्षम नहीं था, लेकिन आंतरिक कोड पता चलता है यह संभव है जब है PropertyAccessor के निर्माण पर magic सक्षम है।


    केवल उपर्युक्त रणनीतियों में से एक का उपयोग करना आवश्यक है।

0

Symfony 3.3.10 के आधार पर

मैं वास्तव में इस समस्या को कई का सामना करना पड़ा और कई बार, अंत में एक बार मैं खोज की है, जहां इस समस्या से आ रहा था, नाम ऐसा हो सकता है कि आप अपने इकाई संपत्ति को देने पर निर्भर करता है कि आपके संग्रह संपत्ति के लिए योजक और रीमूवर बिल्कुल वही नहीं है जो आप उम्मीद कर रहे हैं।

उदाहरण: आपका इकाई properity नाम "foo" है और आप योजक "addFoo" और पदच्युत "removeFoo" कहा जाने अचानक उम्मीद होती है, लेकिन फिर "संपत्ति के लिए पहुँच प्रकार का निर्धारण नहीं किया जा सका" दिखाई देते हैं।

तो आप अपने कोड में w/ई समस्याओं के लिए खोज डर में जा रहा शुरू करते हैं, बजाय आप सिर्फ इस फाइल Symfony कोर फ़ाइलों अंदर देखने के लिए है:

विक्रेता/सिम्फोनी/सिम्फोनी/src/Symfony/घटक/PropertyAccess/PropertyAccessor.php

इस फाइल के अंदर एक विधि findAdderAndRemover कहा जाता है। अपने डीबगर के साथ वहां जाएं और अंत में आपको पता चलेगा कि सिम्फनी आपके योजक/रीमूवर के लिए अजीब नाम की खोज करता है, वे वास्तव में भाषा (मानव भाषा) के आधार पर "um" या "चालू" या "हम" के साथ समाप्त हो सकते हैं। आप उनका नाम इस्तेमाल करते थे। चूंकि मैं इतालवी हूं, यह अक्सर होता है।

इसके लिए देखें, क्योंकि फिक्स आपके इकाई के अंदर अपनी ऐड/निकालने विधि के लिए इस्तेमाल किए गए नाम को बदलने के समान सरल हो सकता है ताकि उन्हें सिम्फनी कोर की तलाश हो सके।

यह मेरे लिए होता है जब मैं bin/कंसोल सिद्धांत का उपयोग करें: उत्पन्न: मेरे लिए स्वचालित रूप से संस्थाओं तरीकों बनाने के लिए

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