Symfony2 घटकों का उपयोग करके अपने PHP प्रोजेक्ट को फिर से कैसे करें

यह पोस्ट लेख का अनुवाद नहीं है, जैसा कि प्रथागत है, लेकिन एक रिपोर्ट + प्रस्तुति है, इसलिए पोस्ट का पाठ काफी स्वतंत्र है।

मुझे लगता है कि हर कोई अच्छी तरह से वाकिफ है और यह स्पष्ट है कि PHP सबसे लोकप्रिय प्रोग्रामिंग भाषाओं में से एक है, जिस पर कई वेब परियोजनाएं लिखी जाती हैं, जिसमें व्यक्तिगत होमपेज पेज से लेकर फेसबुक, विमो, वर्डप्रेस और यहां तक ​​कि YouPorn जैसे मास्टोडन भी शामिल हैं।

PHP 1995 में दिखाई दी, जबकि OOP के लिए पूर्ण समर्थन केवल PHP5 में लागू किया गया था, जिसे 2005 में जारी किया गया था। इस समय के दौरान, बड़ी मात्रा में कोड लिखा गया था, दोनों अच्छे और बुरे, या बल्कि, बहुत पुराने और बनाए रखने के लिए कठिन।

PHP इकोसिस्टम की तरह कई परियोजनाएं, अब एक जीवंत शहर ब्लॉक की झलक दिखाने के लिए शुरू हो गई हैं।



नए PHP संस्करण


नया दशक हमारे लिए PHP5.3 और PHP5.4 लेकर आया, जो उत्पादकता बढ़ाने के अलावा, बहुत सारी अच्छाइयों को लेकर चलती है! यहाँ उनमें से कुछ ही हैं:

1. नामस्थान (php 5.3)

namespace JoliCode\Conferences; use General\Talk\Session; class SymfonyLive extends Session { public function runPresentation() { } } 


2. बेनामी कार्यों और क्लोजर (php 5.3), और वस्तुओं के अंदर भी (php 5.4)

 $container['session'] = function ($c) { return new Session($c['session_storage']); }; 

3. फ़ार अभिलेखागार (php 5.3)

पुस्तकालयों को एक कनेक्टेड फ़ार-फाइल के रूप में वितरित करने की अनुमति दें।

4. "गोटो" - क्या .. .. ?? (php 5.3)

5. लक्षण (php 5.4)

6. सरणियाँ घोषित करने के लिए लघु वाक्य रचना! (php 5.4)

 function fruits() { return ['apple', 'banana', 'orange']; } echo fruits()[0]; // Outputs: apple  

और भी बहुत कुछ

चौखटे


PHP के नए संस्करण चौखटे के उद्भव के लिए उत्प्रेरक बन गए हैं। उनमें से, यह सिम्फनी, ज़ेंड फ्रेमवर्क, वाईआईआई, कोडइग्निटर, केकपीएचपी का उल्लेख करने योग्य है। जारी किए गए दूसरे संस्करणों में उनमें से लगभग सभी को काफी अपडेट किया गया है।

इन रूपरेखाओं में से एक, Symfony2, स्वतंत्र घटकों के एक सेट पर बनाया गया है, साथ ही कई तृतीय-पक्ष समाधान भी हैं जो PHP भाषा की नई विशेषताओं का उपयोग करते हैं और पुराने कोड के साथ आपको फिर से तैयार करने में मदद करते हैं।

परियोजना पुनर्जीवन रणनीति


कल्पना कीजिए कि आपकी परियोजना को लगभग 5 साल हो गए हैं। इस समय के दौरान:


इस मामले में:




तरीका 1: द बिग बैंग

ऐसी स्थिति में सबसे स्वाभाविक इच्छा सभी कोड को बाहर फेंकना और इसे फिर से लिखना है! कल्पना कीजिए कि हम इस तरह से गए। निस्संदेह, हम नए आधुनिक ढाँचों में से एक के साथ काम करने के अवसर से संतुष्टि प्राप्त करेंगे, पुराने कोड के बारे में भूल जाते हैं, और कुछ जगहों पर एक बुरे सपने की तरह, कोड को बायलॉक करते हैं।

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

तरीका 2: लगातार बने रहें

इसलिए, यह हैकिंग के लायक नहीं है, परियोजना के क्रमिक अद्यतन की रणनीति अधिक उचित होगी। उसी समय, परियोजना का विकास और समर्थन बंद नहीं होगा, और इसलिए आपका व्यवसाय बंद नहीं होगा। यह दृष्टिकोण परियोजना में पूरे नए ढांचे के उपयोग की अनुमति नहीं देगा, लेकिन आप इसके व्यक्तिगत भागों का उपयोग कर सकते हैं। इस मामले में Symfony2 घटक बहुत उपयुक्त हैं, क्योंकि उनके पास कोई निर्भरता नहीं है, जबकि वे बिंदु और बिंदु कार्यक्षमता प्रदान करते हैं।

कार्रवाई के लिए आगे बढ़ें


चरण 1. परियोजना को PHP 5.3 या PHP 5.4 में स्थानांतरित करें



सबसे पहले, PHP को कम से कम PHP संस्करण 5.3 में अपडेट करें। हम इसे ध्यान से करते हैं, हम अपडेट को सबसे पहले देव-सर्वर पर करेंगे और जांचेंगे कि सिस्टम का कोई भाग बंद तो नहीं हुआ है। तब आप ठेस सर्वर पर जांच कर सकते हैं। एक ही समय में, यह पूरी परियोजना पर नहीं, बल्कि ए / बी परीक्षण मोड में करने की सलाह दी जाती है, ताकि उपयोगकर्ताओं का केवल एक हिस्सा नए वातावरण में पहुंचे।

एक बार जब आप आश्वस्त हो जाते हैं कि सब कुछ ठीक चल रहा है, तो आप आगे बढ़ सकते हैं।

चरण 2. भविष्य की प्रणाली को फिर से तैयार करने के लिए नींव तैयार करना



हम मुख्य घटकों को जोड़ते हैं: ClassLoader, DependencyInjection और HTTPFoundation। वे हमें फिर से तैयार करने में मदद करेंगे और नए घटकों को जोड़ने की नींव रखेंगे।

ये और सभी निम्नलिखित घटक संगीतकार पैकेज प्रबंधक का उपयोग करके आसानी से जुड़े हो सकते हैं। यह आपको जस प्रारूप में तीसरे पक्ष के पुस्तकालयों पर परियोजना की निर्भरता का सफलतापूर्वक वर्णन करने की अनुमति देता है, स्वचालित रूप से उन्हें स्थापित और अद्यतन करता है, और उन्हें परियोजना में जोड़ने के लिए एक ऑटोलॉड फ़ाइल भी उत्पन्न करता है। Habré पर इसका उपयोग करने के तरीके पर एक अच्छा लेख है।

हमारे मामले में, कम्पोज़र के लिए कॉन्फ़िगरेशन फ़ाइल इस तरह दिखाई देगी:

 { "autoload": { "psr-0": {} }, "name": "xavierlacot/blog", "description": "My old blog on steroids", "require": { "php": ">=5.3.3", "symfony/class-loader": "2.1.*", "symfony/dependency-injection": "2.1.*", "symfony/http-foundation": "2.1.*" } } 

घटकों को स्थापित करें:

 $ php composer.phar install Installing dependencies from lock file - Updating symfony/class-loader (dev-master) 

और उन्हें हमारी परियोजना से कनेक्ट करें:

 <?php //    Composer  require 'vendor/autoload.php'; 

अब हम उनका उपयोग कर सकते हैं!

Classloader। कक्षा स्टार्टअप मानक

डेढ़ साल पहले, PHP समुदाय ने कई समझौतों को अपनाया, उनमें से एक, PSR-0 समझौता , आधुनिक वर्ग ऑटोलॉजिस्ट के साथ संगतता के लिए नियमों और कोड आवश्यकताओं का वर्णन करता है (ऑटोलॉटर का इतिहास अच्छी तरह से यहां और यहां लिखा गया है )

संक्षेप में, मानक दो प्रकार के वर्ग के नामकरण की अनुमति देता है:

नाम स्थान (आधुनिक दृष्टिकोण)
 class: Symfony\Component\HttpFoundation\Request path: vendor/src/Symfony/Component/HttpFoundation/Request.php 

अंडरस्कोर (PEAR मानक, अप्रचलित दृष्टिकोण) के माध्यम से
 class: Twig_Extension_Core path: vendor/twig/lib/Twig/Extension/Core.php 

इस स्थिति में, जब क्लास फ़ाइल कनेक्ट होती है, तो ऑटोलैडर स्वचालित रूप से स्लैश (\) और अंडरस्कोर (_) को रिप्लेसमेंट सेपरेटर (/) के साथ .php एक्सटेंशन को अंत में जोड़ता है।

ClassLoader घटक आपको PSR-0 समझौते के अनुसार वर्ग ऑटोलॉड को व्यवस्थित करने की अनुमति देता है।

चरण 3। कक्षाओं को फिर से भरना और क्लासलोडर का उपयोग करना

उदाहरण के लिए, हमारे पास LDAP के साथ काम करने के लिए एक निश्चित वर्ग है:

 <?php class prefixedLdapConnector { public function __construct() { // -  } } 

हम इसे PSR-0 मानक पर लाते हैं:

 <?php namespace Prefix\Ldap\Client; class Client { public function __construct() { // -  } } 

ClassLoader में उपसर्ग शीर्ष स्तर के स्थान को पंजीकृत करें:

 use Symfony\Component\ClassLoader\UniversalClassLoader; $loader = new UniversalClassLoader(); $loader->registerNamespace('Prefix', __DIR__ . '/src/'); $loader->register(); 

अब, अपने कोड में Prefix \ Ldap \ Client वर्ग का उपयोग करते समय, ClassLoader अपने स्वचालित लोडिंग का ध्यान रखेगा:

 //    ClassLoader use Prefix\Ldap\Client; $client = new Client(); 


चरण 4. अनुरोधों के प्रसंस्करण / प्रतिक्रियाओं की तैयारी। HttpFoundation का उपयोग करना



HTTPFoundation घटक आने वाले अनुरोधों के प्रसंस्करण और एक सर्वर प्रतिक्रिया की तैयारी को सरल करता है।

परियोजना में 2 लाइनें जोड़ना:

 //     ClassLoader,    use Symfony\Component\HttpFoundation\Request; //     Request  HTTPFoundation $request = Request::createFromGlobals(); 


हमें एक $ अनुरोध वस्तु मिलती है जो आने वाले अनुरोध के बारे में सब कुछ जानती है:



और इसी तरह प्रतिक्रिया के साथ:

 use Symfony\Component\HttpFoundation\Response; $response = new Response(); $response->setContent('This will be the response content'); $response->headers->set('Content-Type', 'text/html'); $response->setStatusCode(200); //   Response $response->prepare($request); $response->send(); 


ऐसा लगता है, क्यों सामान्य PHP चर और तरीकों को नई कक्षाओं के साथ बदलें। वास्तव में, यह दृष्टिकोण कई फायदे प्रदान करता है। सबसे पहले, यह आपको वस्तुओं के रूप में प्रस्तुत अनुरोध और प्रतिक्रिया डेटा के साथ काम करने के लिए अमूर्त स्तर को समझने के लिए अनुमति देता है। आप अपने प्रोजेक्ट के किसी भी क्षेत्र से अनुरोध और प्रतिक्रिया को पूरी तरह से नियंत्रित कर सकते हैं। दूसरे, सुरक्षा आवश्यकताओं के अनुपालन के लिए कई स्वतंत्र डेवलपर्स द्वारा इस घटक का परीक्षण किया गया है । तीसरा, HTTPFoundation का उपयोग करने वाला कोड परीक्षण करना बहुत आसान है।

चरण 5. हम सेवाओं में परियोजना की कार्यक्षमता को डिज़ाइन करते हैं। निर्भरता इंजेक्शन घटक

लगभग सभी परियोजनाओं में, कई कार्य हैं जिनके लिए विभिन्न पुस्तकालय, कक्षाएं, या कॉर्न प्रोग्राम फ़ंक्शन जिम्मेदार हैं। निर्भरता इंजेक्शन घटक आपको उन वस्तुओं को बनाने और कॉन्फ़िगर करने की प्रक्रिया को व्यवस्थित और केंद्रीकृत करने की अनुमति देता है जो इस या उस कार्यक्षमता को लागू करते हैं। ऐसी वस्तुओं में एक डाक सेवा, एक डेटाबेस प्रबंधक, एक टेम्पलेट इंजन और कई अन्य शामिल हो सकते हैं।



मान लीजिए कि हमारे पास ईमेल भेजने के लिए एक वर्ग है:

 <?php namespace Prefix\Mailer; class Mailer { $prefix = ''; public function send($to, $subject, $body) { //  } } 


और हमारे कोड में, मेल इस तरह से भेजा जाता है:

 function saveUser($name, $email) { $mailer = new Mailer(); $mailer->send($user->getEmail(), 'Welcome ' . $user->getName(), 'A test'); } 


आइए थोड़ा सा रिफ्लेक्ट करते हैं, एक सर्विस कंटेनर बनाते हैं और उसमें हमारी पोस्टल क्लास रजिस्टर करते हैं:

 use Symfony\Component\DependencyInjection\ContainerBuilder; $container = new ContainerBuilder(); $container->register('mailer', 'Mailer'); 


पत्र भेजने की पंक्तियों में दूसरी छोटी रीफैक्टरिंग करते हैं:

 function saveUser($name, $email) { // stuff here $mailer = $this->container->get('mailer'); $mailer->send($user->getEmail(), 'Welcome '.$user->getName(), 'A test'); } 


ये मामूली बदलाव एक साथ कई बोनस देते हैं:



इसी तरह, आप सेवाओं के रूप में सभी कार्यों को व्यवस्थित करने के बाद, सेवाओं के रूप में एक के बाद एक प्रोजेक्ट लाइब्रेरी को नामित कर सकते हैं।

चरण 6. आगे क्या है?

Symfony2 के पहले तीन घटकों को जोड़कर, आप समान एल्गोरिथ्म का उपयोग अन्य समान रूप से उपयोगी घटकों का उपयोग शुरू करने के लिए कर सकते हैं :



चरण दर चरण, घटक द्वारा घटक, आपकी परियोजना धीरे-धीरे रूपांतरित हो जाएगी और बिना किसी कट्टरपंथी निर्णयों के एक नया जीवन लेगी। गुड लक और अपने refactoring का आनंद लें!

Source: https://habr.com/ru/post/In146521/


All Articles