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