कई पदों और स्टैक ओवरफ़्लो संसाधनों को पढ़ने के बाद, मुझे अभी भी "व्यापार तर्क कहां रखना है" के बारे में प्रसिद्ध प्रश्न के बारे में कुछ समस्याएं मिली हैं? StackOverflow Question और A Blog Post पढ़ना, मेरा मानना है कि मुझे कोड अलगाव के मुद्दे को अच्छी तरह से समझ लिया गया है।Symfony2 में व्यावसायिक तर्क कहां रखा जाए?
मान लीजिए कि मेरे पास एक वेब फॉर्म है जहां आप एक उपयोगकर्ता जोड़ सकते हैं जिसे डीबी में जोड़ा जाएगा। यह उदाहरण इन अवधारणाओं को शामिल है:
- फार्म
- नियंत्रक
- इकाई
- सेवा
- भंडार
मैं कुछ याद नहीं था, तो आप के साथ एक इकाई बनाने के लिए कुछ गुण, गेटर्स, सेटर्स और इतने पर एक डीबी में बने रहने के लिए। यदि आप उस इकाई को लाने या लिखना चाहते हैं, तो आप entityManager
और "गैर-कैननिकल" क्वेरी के लिए, entityRepository
(जहां आप अपनी "क्वेरी भाषा" क्वेरी फिट कर सकते हैं) का उपयोग करेंगे।
अब आपको सभी व्यावसायिक तर्कों के लिए एक सेवा परिभाषित करना है (जो एक "आलसी" उदाहरण वाला PHP वर्ग है); यह "भारी" कोड डालने का स्थान है। एक बार जब आप अपने आवेदन में सेवा रिकॉर्ड कर लेते हैं, तो आप इसे लगभग हर जगह उपयोग कर सकते हैं और इसमें कोड पुन: उपयोग शामिल है और इसी तरह।
जब आप कोई फॉर्म प्रस्तुत करते हैं और पोस्ट करते हैं, तो आप इसे अपनी इकाई (और पाठ्यक्रम की बाधाओं के साथ) से बांधते हैं और सभी को एक साथ रखने के लिए ऊपर परिभाषित सभी अवधारणाओं का उपयोग करते हैं।
तो, "पुराने मुझे" इस तरह से एक नियंत्रक की कार्रवाई लिखते थे:
public function indexAction(Request $request)
{
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$em = $this->getDoctrine()->getEntityManager();
$parameters = $request->request->get('User'); //form retriving
$id = $parameters['id'];
$user = $em->getRepository('SestanteUserBundle:User')->find($id);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$em->flush();
$modified = True;
}
$users = $this->getDoctrine()->getEntityManager()->getRepository('SestanteUserBundle:User')->findAll();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
"नई-मुझे" इस तरह से कोड पुनर्संशोधित गया है:
public function indexAction(Request $request)
{
$um = $this->get('user_manager');
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$user = $um->getUserById($request,False);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$um->flushAll();
$modified = True;
}
$users = $um->showAllUser();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
कहाँ $um
एक है कस्टम सेवा जहां सभी कोड जिन्हें आप # 1 कोड टुकड़े से # 2 कोड टुकड़े में नहीं देख सकते हैं, संग्रहीत किया जाता है।
- मैं, अंत में, symfony2 का सार मिलता है और सामान्य रूप में {M} कुलपति था:
तो, यहाँ मेरी सवाल कर रहे हैं?
- क्या रिफैक्टर अच्छा है? यदि नहीं, तो बेहतर तरीका क्या होगा?
पोस्ट स्क्रिप्टम: मुझे पता है कि मैं उपयोगकर्ता की दुकान और प्रमाणन के लिए FOSUserBundle उपयोग कर सकते हैं, लेकिन यह अपने आप को सिखाने Symfony के साथ काम करने के लिए एक बुनियादी उदाहरण है। इसके अलावा, मेरी सेवा को ORM.Doctrine के साथ इंजेक्शन दिया गया था। * काम करने के लिए (केवल एक नोट जो इस प्रश्न को मेरे भ्रम के साथ पढ़ता है)
क्या $ संशोधित करने के उद्देश्य से है और क्या (getUserById को दूसरा पैरामीटर का उद्देश्य है)? – redbirdo
ठीक है, डोमेन व्यवसाय तर्क [मॉडल परत] में जाता है (http://stackoverflow.com/a/5864000/727208)। [डोमेन ऑब्जेक्ट्स] में मोस्ले (http://c2.com/cgi/wiki?DomainObject)। –
@redbirdo: इससे सवाल के उद्देश्य के लिए कोई फर्क नहीं पड़ता। – DonCallisto