मैंने API-Platform पर आधारित सर्वर सेट अप किया है। मैंने सिम्फनी मेकर-बंडल के साथ कुछ एंटिटीज को ऑटोजेनरेट किया और मेरी जरूरतों को पूरा करने के लिए उन्हें संशोधित किया। अगर मैं एपीआई को पोस्ट-अनुरोध के साथ कॉल करता हूं तो मुझे एक त्रुटि मिलती है Uncaught PHP Exception Symfony\Component\Serializer\Exception\NotNormalizableValueException: "Update is not allowed for this operation."। जैसा कि मैं समझता हूं, इस तरह से संबंधित संस्थाओं को अपडेट करने की अनुमति नहीं है। लेकिन मेरा इरादा ऐसा नहीं है। मुझे तो बस रिश्ता निभाना है

मैं क्या गलत कर रहा हूं?

निम्नलिखित मेरी समस्या का एक सरलीकृत संस्करण है। मैंने ऑटोजेनरेटेड गेटर्स/सेटर्स को छोड़ दिया।

संस्थाएं:

/**
 * @ApiResource(
 *     normalizationContext={"groups"={"book"}},
 *     denormalizationContext={"groups"={"book"}}
 * )
 */
class Book
{
    /**
     * @var integer
     *
     * @Groups({"book"})
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer", options={"unsigned"=true})
     */
     private $id;


    /**
     * @var string
     *
     * @Groups({"book"})
     *
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $name;

    /**
     * @var Language
     *
     * @Groups({"book"})
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\Language", inversedBy="books")
     * @ORM\JoinColumn(nullable=false)
     */
    private $language;
}
/**
 * @ApiResource(normalizationContext={"groups"={"language", "book"}})
 */
class Language
{
    /**
     * @var integer
     *
     * @Groups({"language", "book"})
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer", options={"unsigned"=true})
     */
    private $id;

    /**
     * @var string
     *
     * @Groups({"language", "book"})
     *
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @var Book
     *
     * @ORM\OneToMany(targetEntity="App\Entity\Book", mappedBy="language")
     */
    private $books;
}

यदि मैं एक पहले से मौजूद भाषा वाली पुस्तक बनाने के लिए API को निम्नलिखित POST-अनुरोध भेजता हूं

{
    'name': 'some Name',
    'language': {
        'id': 234,
        'name': "some languages name"
    }
}

एपीआई इस त्रुटि के साथ प्रतिक्रिया करता है

Uncaught PHP Exception Symfony\Component\Serializer\Exception\NotNormalizableValueException: "Update is not allowed for this operation."
0
MontyBurns 2 नवम्बर 2019, 22:15

3 जवाब

अगर मैं इसे सही ढंग से समझता हूं, तो आप मौजूदा भाषा का अद्यतन करना चाहते हैं - और इसे उसी एपीआई ऑपरेशन में एक नई बनाई गई पुस्तक में शामिल करना चाहते हैं?

यह शायद वास्तव में काम नहीं करेगा। आप दो ऑपरेशनों का उपयोग कर सकते हैं (अपडेट करें और IRI के माध्यम से असाइन करें जैसे "/api/language/234")। या आप एक ही बार में एक नई किताब और भाषा बना सकते हैं।

वैसे भी सभी भाषाओं को पूर्व-निर्मित किया जाना चाहिए और उसके बाद केवल चयनित भाषाओं को पुस्तकों को सौंपा जाना चाहिए - फिर नई पुस्तक निर्माण क्रिया के दौरान किसी नाम परिवर्तन की आवश्यकता नहीं होनी चाहिए? :-)

1
Jan Stefanides 12 नवम्बर 2019, 13:07
नहीं, मैं भाषा नहीं बदलना चाहता। मैं पुस्तक को एक मौजूदा भाषा निर्दिष्ट करना चाहता/चाहती हूं
 – 
MontyBurns
17 नवम्बर 2019, 23:23
मौजूदा को असाइन करने के लिए केवल "language": "/api/language/234" प्रारूप का उपयोग करें - आईडी निर्दिष्ट करने के लिए पर्याप्त है, कोई अन्य भाषा विशेषता तब तक संभव नहीं है जब तक आप एक नई भाषा पंक्ति नहीं बनाना चाहते।
 – 
Jan Stefanides
18 नवम्बर 2019, 15:10

मुझे लगता है कि इसकी कोई आवश्यकता नहीं है

/**
 * @var Book
 *
 * @ORM\OneToMany(targetEntity="App\Entity\Book", mappedBy="language")
 */
private $books;

आपकी Language इकाई में क्योंकि यह ManyToOne संबंध है, इसलिए यदि भाषा इकाई के पास नहीं है तो यह काम करने से कोई फर्क नहीं पड़ेगा।

अपनी भाषा इकाई में असामान्यकरण संदर्भ भी जोड़ें या इसे दोनों संस्थाओं से हटा दें।

1
Vipulw 12 नवम्बर 2019, 10:44
पता नहीं क्या आपका जवाब मेरे सवाल का समाधान करता है? त्रुटि अभी भी मौजूद है यदि मैं आपके द्वारा उल्लिखित पंक्तियों पर टिप्पणी करता हूं। संप्रदायीकरण संदर्भ के लिए मुझे क्या जोड़ना चाहिए? मुझे लगा कि मेरी व्याख्या सामान्यीकरण और असामान्यकरण को संभालती है
 – 
MontyBurns
17 नवम्बर 2019, 23:20

मुझे पता नहीं है कि आप अभी भी इस पर रुचि रखते हैं, लेकिन, जब तक आप Book के लिए एक सामान्य बनाने में कोई आपत्ति नहीं करते हैं, तब तक id के लिए एक और नाम बनाएं। ऐसा लगता है कि आईआरआई उपयोग के लिए "आरक्षित" है (प्रतिक्रिया @id विशेषता के साथ आती है)।

github मुद्दे पर डिस्कशन और कुछ समाधान देखें।

0
Igor Pereira 14 अक्टूबर 2021, 22:47
1
जैसा कि वर्तमान में लिखा गया है, आपका उत्तर अस्पष्ट है। कृपया अतिरिक्त विवरण जोड़ने के लिए संपादित करें जिससे दूसरों को यह समझने में मदद मिलेगी कि यह पूछे गए प्रश्न को कैसे संबोधित करता है। आप सहायता केंद्र में अच्छे उत्तर लिखने के तरीके के बारे में अधिक जानकारी प्राप्त कर सकते हैं।
 – 
Community
15 अक्टूबर 2021, 04:53