सिम्फनी - सिद्धांत ओआरएम

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

डेटाबेस मॉडल

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

सिद्धांत ORM

डिफ़ॉल्ट रूप से, सिम्फनी फ्रेमवर्क डेटाबेस के साथ काम करने के लिए कोई घटक प्रदान नहीं करता है। लेकिन, यह कसकर एकीकृत करता हैDoctrine ORM। डॉक्ट्रिन में डेटाबेस स्टोरेज और ऑब्जेक्ट मैपिंग के लिए कई PHP लाइब्रेरीज़ का उपयोग किया जाता है।

निम्नलिखित उदाहरण आपको यह समझने में मदद करेंगे कि डॉक्ट्रिन कैसे काम करता है, एक डेटाबेस को कैसे कॉन्फ़िगर करें और डेटा को कैसे बचाएं और पुनः प्राप्त करें।

सिद्धांत ORM उदाहरण

इस उदाहरण में, हम पहले डेटाबेस को कॉन्फ़िगर करेंगे और एक छात्र ऑब्जेक्ट बनाएंगे, फिर उसमें कुछ ऑपरेशन करेंगे।

ऐसा करने के लिए हमें निम्नलिखित चरणों का पालन करना होगा।

चरण 1: एक सिम्फनी एप्लिकेशन बनाएं

एक सिम्फनी एप्लिकेशन बनाएं, dbsample निम्नलिखित कमांड का उपयोग करना।

symfony new dbsample

चरण 2: एक डेटाबेस कॉन्फ़िगर करें

आम तौर पर, डेटाबेस की जानकारी "एप्लिकेशन / कॉन्फिग / पैरामीटर्स.मल" फाइल में कॉन्फ़िगर की जाती है।

फ़ाइल खोलें और निम्नलिखित परिवर्तन जोड़ें।

parameter.yml

parameters: 
   database_host: 127.0.0.1 
   database_port: null
   database_name: studentsdb 
   database_user: <user_name> 
   database_password: <password> 
   mailer_transport: smtp 
   mailer_host: 127.0.0.1 
   mailer_user: null 
   mailer_password: null 
   secret: 037ab82c601c10402408b2b190d5530d602b5809 
   
   doctrine: 
      dbal: 
      driver:   pdo_mysql 
      host:     '%database_host%' 
      dbname:   '%database_name%' 
      user:     '%database_user%' 
      password: '%database_password%' 
      charset: utf8mb4

अब, Doctrine ORM डेटाबेस से जुड़ सकता है।

चरण 3: एक डेटाबेस बनाएँ

"छात्रों" डेटाबेस बनाने के लिए निम्नलिखित आदेश जारी करें। इस कदम का इस्तेमाल Doctrine ORM में डेटाबेस को बांधने के लिए किया जाता है।

php bin/console doctrine:database:create

कमांड निष्पादित करने के बाद, यह स्वचालित रूप से एक खाली "स्टूडेंटब" डेटाबेस उत्पन्न करता है। आप अपनी स्क्रीन पर निम्न प्रतिक्रिया देख सकते हैं।

Created database `studentsdb` for connection named default

चरण 4: मानचित्र जानकारी

मैपिंग की जानकारी "मेटाडेटा" के अलावा और कुछ नहीं है। यह नियमों का एक संग्रह है जो डॉक्ट्रिन ओआरएम को सूचित करता है कि कैसे छात्र वर्ग और उसके गुणों को एक विशिष्ट डेटाबेस तालिका में मैप किया जाता है।

खैर, इस मेटाडेटा को कई अलग-अलग प्रारूपों में निर्दिष्ट किया जा सकता है, जिसमें YAML, XML शामिल हैं या आप एनोटेशन का उपयोग करके सीधे छात्र वर्ग पास कर सकते हैं। इसे निम्नानुसार परिभाषित किया गया है।

Student.php

फ़ाइल में निम्न परिवर्तन जोड़ें।

<?php  
namespace AppBundle\Entity;  

use Doctrine\ORM\Mapping as ORM;  
/** 
   * @ORM\Entity 
   * @ORM\Table(name = "students") 
*/ 
class Student { 
   /** 
      * @ORM\Column(type = "integer") 
      * @ORM\Id 
      * @ORM\GeneratedValue(strategy = "AUTO") 
   */ 
   private $id;  
    
   /** 
      * @ORM\Column(type = "string", length = 50) 
   */ 
   private $name;  
   
   /** 
     * @ORM\Column(type = "text") 
     */ 
   private $address; 
}

यहां, तालिका का नाम वैकल्पिक है। यदि तालिका का नाम निर्दिष्ट नहीं है, तो यह इकाई वर्ग के नाम के आधार पर स्वचालित रूप से निर्धारित किया जाएगा।

चरण 5: एक इकाई को बांधें

सिद्धांत आपके लिए सरल इकाई वर्ग बनाता है। यह आपको किसी भी इकाई के निर्माण में मदद करता है।

एक इकाई उत्पन्न करने के लिए निम्नलिखित आदेश जारी करें।

php bin/console doctrine:generate:entities AppBundle/Entity/Student

फिर आपको निम्नलिखित परिणाम दिखाई देंगे और इकाई को अपडेट किया जाएगा।

Generating entity "AppBundle\Entity\Student" 
   > backing up Student.php to Student.php~ 
   > generating AppBundle\Entity\Student

Student.php

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM;  
/** 
   * @ORM\Entity 
   * @ORM\Table(name="students") 
*/ 
class Student { 
   /** 
      * @ORM\Column(type="integer") 
      * @ORM\Id 
      * @ORM\GeneratedValue(strategy="AUTO") 
   */ 
   private $id;  
    
   /** 
      * @ORM\Column(type = "string", length = 50) 
   */ 
   private $name; 
    
   /** 
      * @ORM\Column(type = "text") 
   */
   private $address; 
    
   /** 
      * Get id 
      * 
      * @return integer 
   */ 
   public function getId() { 
      return $this->id; 
   }  
    
   /** 
      * Set name 
      * 
      * @param string $name 
      * 
      * @return Student 
   */ 
    
   public function setName($name) { 
      $this->name = $name;  
      return $this; 
   }  
    
   /** 
      * Get name 
      * 
      * @return string 
   */ 
    
   public function getName() { 
      return $this->name; 
   }  
    
   /**
      * Set address 
      * 
      * @param string $address 
      * 
      * @return Student 
   */ 
    
   public function setAddress($address) { 
      $this->address = $address;  
      return $this; 
   }  
    
   /** 
      * Get address 
      * 
      * @return string 
   */ 
   
   public function getAddress() { 
      return $this->address; 
   } 
}

चरण 6: मानचित्र सत्यापन

इकाइयां बनाने के बाद, आपको निम्न कमांड का उपयोग करके मैपिंग को मान्य करना चाहिए।

php bin/console doctrine:schema:validate

यह निम्नलिखित परिणाम का उत्पादन करेगा -

[Mapping]  OK - The mapping files are correct. 
[Database] FAIL - The database schema is not in sync with the current mapping file

चूंकि हमने छात्रों की तालिका नहीं बनाई है, इसलिए इकाई सिंक से बाहर है। हमें अगले चरण में सिम्फनी कमांड का उपयोग करके छात्र तालिका बनाते हैं।

चरण 7: एक स्कीमा बनाएं

छात्र इकाई के लिए आवश्यक सभी डेटाबेस तालिकाओं को स्वचालित रूप से बना सकते हैं। यह निम्नलिखित कमांड का उपयोग करके किया जा सकता है।

php bin/console doctrine:schema:update --force

कमांड निष्पादित करने के बाद, आप निम्न प्रतिक्रिया देख सकते हैं।

Updating database schema... 
Database schema updated successfully! "1" query was executed

यह कमांड इस बात की तुलना करता है कि आपका डेटाबेस कैसा दिखना चाहिए, यह वास्तव में कैसा दिखता है, और डेटाबेस स्कीमा को अपडेट करने के लिए आवश्यक SQL कथन निष्पादित करता है जहां यह होना चाहिए।

अब, फिर से निम्न आदेश का उपयोग करके स्कीमा को मान्य करें।

php bin/console doctrine:schema:validate

यह निम्नलिखित परिणाम का उत्पादन करेगा -

[Mapping]  OK - The mapping files are correct. 
[Database] OK - The database schema is in sync with the mapping files

चरण 8: गेटटर और सेटर

जैसा कि बिंड इन ए एंटिटी सेक्शन में देखा गया है, निम्न कमांड स्टूडेंट क्लास के लिए सभी गेटर्स और सेटर बनाता है।

$ php bin/console doctrine:generate:entities AppBundle/Entity/Student

चरण 9: डेटाबेस के लिए वस्तुओं को जारी रखें

अब, हमने छात्र इकाई को उसकी संबंधित छात्र तालिका में मैप कर दिया है। अब हमें डेटाबेस में छात्र वस्तुओं को जारी रखने में सक्षम होना चाहिए। बंडल के StudentController के लिए निम्न विधि जोड़ें।

StudentController.php

<?php  
namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response;  
use AppBundle\Entity\Student; 

class StudentController extends Controller { 
   /** 
      * @Route("/student/add") 
   */ 
   public function addAction() { 
      $stud = new Student(); 
      $stud->setName('Adam'); 
      $stud->setAddress('12 north street'); 
      $doct = $this->getDoctrine()->getManager();
      
      // tells Doctrine you want to save the Product 
      $doct->persist($stud);
      
      //executes the queries (i.e. the INSERT query) 
      $doct->flush(); 
      
      return new Response('Saved new student with id ' . $stud->getId()); 
   } 
}

यहां, हमने आधार नियंत्रक के getDoctrine () के माध्यम से getManager () विधि का उपयोग करके सिद्धांत प्रबंधक तक पहुंच बनाई और फिर सिद्धांत () सिद्धांत के प्रबंधक का उपयोग करके वर्तमान वस्तु को जारी रखें। persist() विधि कतार में कमांड जोड़ता है, लेकिन flush() विधि वास्तविक कार्य करती है (छात्र वस्तु को जारी रखना)।

चरण 10: डेटाबेस से ऑब्जेक्ट्स लाएं

स्टूडेंटकंट्रोलर में एक फंक्शन बनाएं जो स्टूडेंट डिटेल्स को प्रदर्शित करेगा।

StudentController.php

/** 
   * @Route("/student/display") 
*/ 
public function displayAction() { 
   $stud = $this->getDoctrine() 
   ->getRepository('AppBundle:Student') 
   ->findAll();
   return $this->render('student/display.html.twig', array('data' => $stud)); 
}

चरण 11: एक दृश्य बनाएं

आइए एक दृश्य बनाएं जो कार्रवाई प्रदर्शित करने के लिए इंगित करता है। व्यू डायरेक्टरी में जाएँ और एक फाइल बनाएँ "display.html.twig"। फ़ाइल में निम्न परिवर्तन जोड़ें।

display.html.twig

<style> 
   .table { border-collapse: collapse; } 
   .table th, td { 
      border-bottom: 1px solid #ddd; 
      width: 250px; 
      text-align: left; 
      align: left; 
   } 
</style> 

<h2>Students database application!</h2>  
<table class = "table">  
   <tr>  
      <th>Name</th>  
      <th>Address</th>  
   </tr>  
   {% for x in data %} 
   <tr>  
      <td>{{ x.Name }}</td>   
      <td>{{ x.Address }}</td>   
   </tr>  
   {% endfor %} 
</table>

आप एक ब्राउज़र में URL "http: // localhost: 8000 / student / display" का अनुरोध करके परिणाम प्राप्त कर सकते हैं।

यह स्क्रीन पर निम्न आउटपुट का उत्पादन करेगा -

चरण 12: एक वस्तु को अपडेट करें

स्टूडेंटकंट्रोलर में किसी ऑब्जेक्ट को अपडेट करने के लिए, एक एक्शन बनाएं और निम्नलिखित बदलाव जोड़ें।

/** 
   * @Route("/student/update/{id}") 
*/ 
public function updateAction($id) { 
   $doct = $this->getDoctrine()->getManager(); 
   $stud = $doct->getRepository('AppBundle:Student')->find($id);  
   
   if (!$stud) { 
      throw $this->createNotFoundException( 
         'No student found for id '.$id 
      ); 
   } 
   $stud->setAddress('7 south street'); 
   $doct->flush(); 
   
   return new Response('Changes updated!'); 
}

अब, URL का अनुरोध करें "http: // localhost: 8000 / छात्र / अद्यतन / 1" और यह निम्नलिखित परिणाम का उत्पादन करेगा।

यह स्क्रीन पर निम्न आउटपुट का उत्पादन करेगा -

चरण 13: किसी ऑब्जेक्ट को हटाएँ

किसी ऑब्जेक्ट को हटाना समान है और इसके लिए निकाय () सिद्धांत (प्रबंधक) की विधि को हटाने की आवश्यकता है।

यह निम्नलिखित कमांड का उपयोग करके किया जा सकता है।

/** 
   * @Route("/student/delete/{id}") 
*/ 
public function deleteAction($id) { 
   $doct = $this->getDoctrine()->getManager(); 
   $stud = $doct->getRepository('AppBundle:Student')->find($id);  
    
   if (!$stud) { 
      throw $this->createNotFoundException('No student found for id '.$id); 
   }  
    
   $doct->remove($stud); 
   $doct->flush();  
   
   return new Response('Record deleted!'); 
}