এভাবেই আমি এই মতবাদটির সমাধান করেছি "দ্য ইন্টিটি ম্যানেজারটি বন্ধ is" সমস্যা. মূলত প্রতিবারই একটি ব্যতিক্রম (যেমন ডুপ্লিকেট কী) বা বাধ্যতামূলক কলামের জন্য ডেটা সরবরাহ না করার কারণে ডক্ট্রাইন সত্তা পরিচালককে বন্ধ করে দেবে। আপনি যদি এখনও ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করতে চান তবে জেগ্রিননresetManager()
দ্বারা উল্লিখিত পদ্ধতিটিতে কল করে আপনাকে সত্তা ম্যানেজারটি পুনরায় সেট করতে হবে ।
আমার অ্যাপ্লিকেশনটিতে আমি একাধিক রব্বিটএমকিউ ভোক্তা চালাচ্ছিলাম যা সবাই একই কাজ করত: ডাটাবেসে কোনও সত্তা ছিল কিনা তা পরীক্ষা করে, হ্যাঁ যদি এটি তৈরি করে না, তবে এটি তৈরি না করে আবার ফিরিয়ে দিন। যদি সেই সত্তা ইতিমধ্যে বিদ্যমান ছিল কিনা তা যাচাই করে অন্য গ্রাহক তৈরি করার মধ্যবর্তী কয়েক মিলি সেকেন্ডে এটি একই রকম ঘটেছে এবং অনুপস্থিত সত্তা তৈরি করে যা অন্য ভোক্তাকে একটি নকল কী ব্যতিক্রম ( বর্ণের শর্ত ) দ্বারা ব্যয় করে।
এটি একটি সফ্টওয়্যার ডিজাইনের সমস্যা তৈরি করেছিল। মূলত আমি যা করার চেষ্টা করছিলাম তা হ'ল একটি লেনদেনে সমস্ত সত্তা তৈরি করা। এটি বেশিরভাগের কাছেই স্বাভাবিক অনুভূত হতে পারে তবে আমার ক্ষেত্রে এটি অবশ্যই ধারণাগতভাবে ভুল ছিল। নিম্নলিখিত সমস্যাটি বিবেচনা করুন: আমাকে একটি ফুটবল ম্যাচ সত্তা সংরক্ষণ করতে হয়েছিল যার মধ্যে এই নির্ভরতা ছিল।
- একটি গ্রুপ (যেমন গ্রুপ এ, গ্রুপ বি ...)
- একটি রাউন্ড (যেমন সেমি ফাইনাল ...)
- একটি ভেন্যু (মানে স্টেডিয়াম যেখানে ম্যাচটি হচ্ছে)
- ম্যাচের স্থিতি (যেমন অর্ধবার, পুরো সময়)
- দুটি দল ম্যাচ খেলছে
- ম্যাচ নিজেই
এখন, কেন ভেন্যু তৈরি করা ম্যাচের মতো একই লেনদেনের মধ্যে হওয়া উচিত? এটি হতে পারে যে আমি সবেমাত্র একটি নতুন ভেন্যু পেয়েছি যা এটি আমার ডাটাবেসে নেই তাই আমাকে এটি তৈরি করতে হবে। তবে এটি এমনও হতে পারে যে ভেন্যুটি অন্য ম্যাচটি হোস্ট করতে পারে তাই অন্য গ্রাহক সম্ভবত এটি একই সাথে তৈরি করার চেষ্টা করবে। সুতরাং আমাকে যা করতে হবে তা হ'ল পৃথক লেনদেনের মধ্যে প্রথমে সমস্ত নির্ভরতা তৈরি করা হয়েছিল তা নিশ্চিত করে আমি সত্তা পরিচালককে একটি সদৃশ কী ব্যতিক্রমতে পুনরায় সেট করছি। আমি বলব যে ম্যাচের পাশের সেখানে থাকা সমস্ত সত্তাকে "ভাগ করে নেওয়া" হিসাবে সংজ্ঞায়িত করা যেতে পারে কারণ তারা সম্ভবত অন্যান্য গ্রাহকদের অন্যান্য লেনদেনের অংশ হতে পারে। সেখানে "ভাগ" করা হয়নি এমন কিছু মিলটি নিজেই রয়েছে যা সম্ভবত একই সাথে দুটি গ্রাহক তৈরি করতে পারবেন না।
এই সবগুলি আরও একটি সমস্যার দিকে পরিচালিত করেছিল। আপনি যদি সত্তা পরিচালককে পুনরায় সেট করেন, পুনরায় সেট করার আগে আপনি যে সমস্ত বস্তু পুনরুদ্ধার করেছেন তা ডক্ট্রিনের জন্য সম্পূর্ণ নতুন। সুতরাং মতবাদ তাদের উপর একটি আপডেট আপডেট চালানোর চেষ্টা করবে না তবে একটি সংযোজন ! সুতরাং নিশ্চিত হয়ে নিন যে আপনি আপনার সমস্ত নির্ভরতা যুক্তিসঙ্গতভাবে সঠিক লেনদেনের ক্ষেত্রে তৈরি করেছেন এবং তারপরে আপনার সমস্ত অবজেক্টগুলি লক্ষ্য সত্তায় সেট করার আগে ডাটাবেস থেকে ফিরে পাবেন। নিম্নলিখিত কোডটি উদাহরণ হিসাবে বিবেচনা করুন:
$group = $this->createGroupIfDoesNotExist($groupData);
$match->setGroup($group);
$venue = $this->createVenueIfDoesNotExist($venueData);
$round = $this->createRoundIfDoesNotExist($roundData);
সুতরাং এটি আমার মনে হয় এটি করা উচিত।
$group = $this->createGroupIfDoesNotExist($groupData);
$venue = $this->createVenueIfDoesNotExist($venueData);
$round = $this->createRoundIfDoesNotExist($roundData);
$group = $this->getGroup($groupData);
$venue = $this->getVenue($venueData);
$round = $this->getGroup($roundData);
$match->setGroup($group);
$match->setVenue($venue);
$match->setRound($round);
$matchTeamHome = new MatchTeam();
$matchTeamHome->setMatch($match);
$matchTeamHome->setTeam($teamHome);
$matchTeamAway = new MatchTeam();
$matchTeamAway->setMatch($match);
$matchTeamAway->setTeam($teamAway);
$match->addMatchTeam($matchTeamHome);
$match->addMatchTeam($matchTeamAway);
$em->persist($match);
$em->persist($matchTeamHome);
$em->persist($matchTeamAway);
$em->flush();
আমি আসা করি এটা সাহায্য করবে :)