Symfony - Doktrin ORM

Symfony web çerçevesinde model önemli bir rol oynar. Ticari varlıklardır. Bunlar ya müşteriler tarafından sağlanır ya da arka uç veritabanından alınır, iş kurallarına göre manipüle edilir ve veritabanına geri gönderilir. Views tarafından sunulan verilerdir. Bu bölümde modeller ve arka uç sistemle nasıl etkileşim kurduklarını öğrenelim.

Veritabanı Modeli

Modelleri güvenli ve verimli bir şekilde getirmek ve sürdürmek için modellerimizi arka uç ilişkisel veritabanı öğeleriyle eşleştirmemiz gerekir. Bu eşleme, bir Nesne İlişkisel Eşleme (ORM) aracı ile yapılabilir. Symfony ayrı bir paket sağlar,DoctrineBundleSymfony'yi üçüncü taraf PHP veritabanı ORM aracı ile entegre eden, Doctrine.

Doktrin ORM

Varsayılan olarak, Symfony çerçevesi veritabanları ile çalışmak için herhangi bir bileşen sağlamaz. Ancak, sıkı bir şekilde bütünleşirDoctrine ORM. Doctrine, veritabanı depolama ve nesne eşleme için kullanılan birkaç PHP kitaplığı içerir.

Aşağıdaki örnek, Doctrine'in nasıl çalıştığını, bir veritabanının nasıl yapılandırılacağını ve verilerin nasıl kaydedilip alınacağını anlamanıza yardımcı olacaktır.

Doktrin ORM Örneği

Bu örnekte, önce veritabanını yapılandırıp bir Öğrenci nesnesi oluşturacağız, ardından içinde bazı işlemler gerçekleştireceğiz.

Bunu yapmak için aşağıdaki adımlara uymamız gerekir.

Adım 1: Bir Symfony Uygulaması Oluşturun

Bir Symfony uygulaması oluşturun, dbsample aşağıdaki komutu kullanarak.

symfony new dbsample

Adım 2: Bir Veritabanını Yapılandırın

Genel olarak, veritabanı bilgileri "app / config / parameters.yml" dosyasında yapılandırılır.

Dosyayı açın ve aşağıdaki değişiklikleri ekleyin.

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

Artık Doctrine ORM veritabanına bağlanabilir.

3. Adım: Bir Veritabanı Oluşturun

"Studentsdb" veritabanı oluşturmak için aşağıdaki komutu çalıştırın. Bu adım veritabanını Doctrine ORM'de bağlamak için kullanılır.

php bin/console doctrine:database:create

Komutu çalıştırdıktan sonra, otomatik olarak boş bir "studentdb" veritabanı oluşturur. Aşağıdaki yanıtı ekranınızda görebilirsiniz.

Created database `studentsdb` for connection named default

Adım 4: Harita Bilgileri

Harita bilgisi "meta veriler" den başka bir şey değildir. Doctrine ORM'yi Öğrenci sınıfı ve özelliklerinin belirli bir veritabanı tablosuyla tam olarak nasıl eşleştirildiğini bildiren bir kurallar koleksiyonudur.

Bu meta veriler, YAML, XML dahil bir dizi farklı biçimde belirtilebilir veya ek açıklamaları kullanarak Öğrenci sınıfını doğrudan geçebilirsiniz. Aşağıdaki gibi tanımlanır.

Student.php

Dosyaya aşağıdaki değişiklikleri ekleyin.

<?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; 
}

Burada tablo adı isteğe bağlıdır. Tablo adı belirtilmezse, varlık sınıfının adına göre otomatik olarak belirlenecektir.

Adım 5: Bir Varlığı Bağlayın

Doctrine sizin için basit varlık sınıfları oluşturur. Herhangi bir varlığı oluşturmanıza yardımcı olur.

Bir varlık oluşturmak için aşağıdaki komutu verin.

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

Ardından aşağıdaki sonucu göreceksiniz ve varlık güncellenecektir.

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; 
   } 
}

Adım 6: Harita Doğrulaması

Varlıkları oluşturduktan sonra, aşağıdaki komutu kullanarak eşlemeleri doğrulamalısınız.

php bin/console doctrine:schema:validate

Aşağıdaki sonucu verecektir -

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

Öğrenciler tablosunu oluşturmadığımız için varlık senkronize değil. Sonraki adımda Symfony komutunu kullanarak öğrenci tablosunu oluşturalım.

7. Adım: Şema Oluşturun

Doctrine, Öğrenci varlığı için gerekli olan tüm veritabanı tablolarını otomatik olarak oluşturabilir. Bu, aşağıdaki komut kullanılarak yapılabilir.

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

Komutu çalıştırdıktan sonra aşağıdaki yanıtı görebilirsiniz.

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

Bu komut, veritabanınızın gerçekte nasıl görünmesi gerektiği ile nasıl görünmesi gerektiğini karşılaştırır ve veritabanı şemasını olması gereken yere güncellemek için gereken SQL ifadelerini yürütür.

Şimdi, aşağıdaki komutu kullanarak şemayı tekrar doğrulayın.

php bin/console doctrine:schema:validate

Aşağıdaki sonucu verecektir -

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

Adım 8: Alıcı ve ayarlayıcı

Bir Varlığı Bağla bölümünde görüldüğü gibi, aşağıdaki komut Öğrenci sınıfı için tüm alıcıları ve ayarlayıcıları oluşturur.

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

Adım 9: Nesneleri Veritabanına Devam Ettirin

Şimdi, Öğrenci varlığını karşılık gelen Öğrenci tablosuyla eşleştirdik. Artık Öğrenci nesnelerini veritabanında saklayabilmeliyiz. Paketin StudentController öğesine aşağıdaki yöntemi ekleyin.

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()); 
   } 
}

Burada, doktrin yöneticisine getManager () yöntemini kullanarak temel denetleyicinin getDoctrine () yöntemini kullanarak eriştik ve ardından doktrin yöneticisinin persist () yöntemini kullanarak mevcut nesneyi sürdürdük. persist() yöntem komutu kuyruğa ekler, ancak flush() yöntem asıl işi yapar (öğrenci nesnesini ısrarla).

Adım 10: Veritabanından Nesneleri Getirin

StudentController'da öğrenci ayrıntılarını gösterecek bir işlev oluşturun.

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)); 
}

Adım 11: Bir Görünüm Oluşturun

Eylemi göstermeye işaret eden bir görünüm oluşturalım. Views dizinine gidin ve bir "display.html.twig" dosyası oluşturun. Dosyaya aşağıdaki değişiklikleri ekleyin.

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>

Sonucu, bir tarayıcıda "http: // localhost: 8000 / student / display" URL'sini talep ederek elde edebilirsiniz.

Ekranda aşağıdaki çıktıyı üretecektir -

Adım 12: Bir Nesneyi Güncelleyin

StudentController'da bir nesneyi güncellemek için bir eylem oluşturun ve aşağıdaki değişiklikleri ekleyin.

/** 
   * @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!'); 
}

Şimdi "http: // localhost: 8000 / Student / update / 1" URL'sini isteyin ve aşağıdaki sonucu verecektir.

Ekranda aşağıdaki çıktıyı üretecektir -

Adım 13: Bir Nesneyi Silin

Bir nesneyi silmek benzerdir ve varlık (doktrin) yöneticisinin remove () yöntemine bir çağrı gerektirir.

Bu, aşağıdaki komut kullanılarak yapılabilir.

/** 
   * @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!'); 
}