08.Symfony Doctrine — Veritabanına Kayıt Ekleme

08.Symfony Doctrine — Veritabanına Kayıt Ekleme

Bir önceki yazımda kitap bilgilerimizi tutacak Book adında bir adet Entity oluşturmuştuk. O yazımı henüz okumadıysanız 07.Symfony Doctrine — Entity adlı yazımı okumanızı tavsiye ederim. Bu yazımda ise Symfony de Doctrine ile oluşturduğumuz veritabanına nasıl kayıt ekleriz, bundan bahsedeceğim. Aslında Symfony Veritabanına Kayıt Ekleme zor yada karmaşık bir işlem değildir. Eğer OOP(Nesne Yönelimli PHP) ye aşina iseniz, aslında çok basittir. Tabi dikkat etmemiz gereken yerlerde yok değil. Symfony Veritabanına Kayıt Ekleme esnasında dikkat etmemiz gereken yerleri açıklayacağım.

 

 

Symfony Veritabanına Kayıt Ekleme

Yukarıda belirttim, bir adet Book adlı Entity dosyamız hazır. Yapmamız gereken bu Entity yardımıyla bir adet kaydı veritabanımıza eklemek. Öncelikle bir adet Controller dosyası oluşturmam gerekiyor. Çünkü Symfony Framework ilk kurulduğunda varsayılan olarak hiç Controller gelmiyor. Controller dosyamızı oluşturduktan sonra Silme, Güncelleme yada Görüntüleme işlemlerinde de bu Controller ı kullanacağız. Oluşturacağımız Controller dosyamız yardımıyla http://www.symfonydemo.com/admin/book/new adresine gidince veritabanına bir adet kayıt ekleyecek.

Controller Dosyamızı Oluşturalım

E:\Projects\Book\src\Controller dizini içerisime BookController.php adlı bir adet dosya oluşturun. Tam yolu : E:\Projects\Book\src\Controller\BookController.php daha sonra aşağıda ki kodu kopyalayın ve yeni oluşturduğunuz BookController.php içerisine yapıştırın.

<?php
// E:\Projects\Book\src\Controller\BookController.php

namespace App\Controller;

use App\Entity\Book;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Carbon\Carbon;

/**
 * @Route("/admin/book", name="admin_book_")
 */
class BookController extends Controller
{

    /**
     * @Route("/new/", name="new")
     */
    public function new()
    {
        // Entity mizi çağırıyoruz.
        $book = new Book();

        // Kitabın Adı
        $book->setName("Game of Thrones");
        // Kitabın Açıklaması
        $book->setExcerpt("Taht oyunlarını oynarken orta nokta yoktur: kazanır ya da ölürsün.");
        // Kitabın Sayfa Sayısı
        $book->setPage(300);
        // Kitabın ISBN Numarası
        $book->setIsbn("6055069070");
        // Kitabın Fiyatı
        $book->setPrice(59.99);
        // Kitabın Yayınlanma tarihi. Örneğin kitap 1 ile 10 yıl arasında yayınlanmış olsun
        $book->setPublishedAt(Carbon::now()->subYears(mt_rand(1,10)));
        // Kitabın Yazarı
        $book->setAuthor("George R.R. Martin ");
        // Kitabın Sitemde Aktif mi.
        $book->setIsPublish(true);

        // Doctrine nin Nesne Yöneticisini çağırıyoruz.
        // Bu satır veritabanları işlemlerinde en önemli satırdır.
        // Bu satır yardımıyla, veritabanlarında
        // Insert, Update, Delete vb işlemleri yapıyoruz.
        $em = $this->getDoctrine()->getManager();

        // Doctrine bu bilgileri kayıt etmek istediğimizi haber veriyoruz.
        // Henüz kayıt etmedik, sorgumuzu çalıştırmadık.
        // Sadece Doctrine kayıt etmek istediğimizi söylüyoruz.
        $em->persist($book);

        // Doctrine bu bilgileri kayıt etmesini söylüyoruz.
        // Yaptığımız işleme(Insert) uygun sorgu burada çalışıyor.
        $em->flush();

        // İşlem sonunda oluşan ID yi getir.
        dump("Eklenen Kayıt ID: " . $book->getId());

        // İşlemi bitir, daha fazla devam etme..
        die();
    }


}

Sırayla gidelim. Yukarıda ki kodu inceleyin. Bende parça parça size aşağıda açıklamalar yardımıyla anlatacağım. Öncelikle namespace kısmına bakalım.



<?php
// E:\Projects\Book\src\Controller\BookController.php

namespace App\Controller; <====



Ok işareti ile gösterdiğim yere dikkat ederseniz, namespace ibaresini görürsünüz. Eğer daha önce php de hiç namespace i işitmediyseniz, Google da kısa bir arama yapın. Böylelikle az çok namespace hakkında bir fikriniz olacaktır. Gördüğünüz üzere bizim namespace imiz App\Controller; Size şimdilik bir anlam ifade etmeyebilir. Aslında çok önemlidir vede kullanışlı. Konumuz olmadığı için bu kısmı atlayacağız ama ileride Symfony de namespace kullanımını örneklendireceğim.

use App\Entity\Book;

Burada Entity dosyamızı çağırdık, bir nevi php de bulunan include gibi düşünebilirsiniz. Controller dosyamızı incelerseniz eğer aşağıda ki satırı görürsünüz.


$book = new Book();

Eğer use kısmında use App\Entity\Book; olmasa idi, uzun yolu yazardık. Yani aşağıda ki gibi yazardık.

$book = new use App\Entity\Book();

/**
 * @Route("/admin/book", name="admin_book_")
 */
class BookController extends Controller
{
....
}

İkinci kısım ise Rota ( Route ). Yukarıda ki Class kısmını incelerseniz eğer, @Route(“/admin/book”, name=”admin_book_”) dikkatinizi çekmiştir. Burada 2 şeye dikkatinizi çekmek istiyorum.

  1. “/admin/book” => Genel Rotamız/Yolumuz. GENEL. (Şimdilik aklınızda tutun. Aşağıda açıklayacağım.)
  2. name=”admin_book_” => Genel Ad. GENEL. (Şimdilik aklınızda tutun. Aşağıda açıklayacağım.)

Aslında prefix diye de düşünebilirsiniz.

Burada diğer önemli nokta ise BookController class dosyamızın Extends olduğu dosya. Controller dosyasından extend olduğu için, Symfony nin özelliklerine erişebiliyoruz. extends Controller ibaresi olmasa idi, Symfony ile ilgili her hangi birşeye erişemeyecektik.


    /**
     * @Route("/new/", name="new")
     */
    public function newAction()
    {
        // Gereksiz kısımları sildim. 

    }

 
Yukarıda ki satırı inceleyin, ama aklınızın bir kenarında class kısmında yazdığım GENEL olarak belirttiğim kısımda olsun. Rota kısmında şöyle bir ibare var. @Route(“/new/”, name=”new”) . Yani Bu fonkyionun adı new değil, admin_book_new, ve yolu da /new/ değil, /admin/book/new/ ÇÜNKÜ:

Eğer Controller içerisinde Class dosyamıza bir Rota ve/veya bir İsim tanımlarsak eğer, bu class içerisinde ki tüm fonksiyonları etkiler ve, class içerisinde ki fonksiyonlarda yaptığımız tanımlamaların önüne prefix şeklinde gelir.


Class Rota: /admin/book
new Fonksiyonunun Rotası: /new/
Sonuç: /admin/book/new/


Class İsim: admin_book_
new Fonksiyonunun İsmiı: new
Sonuç: admin_book_new


Symfony Rotalar kısmını okuduysanız eğer, size orada şöyle bir açıklama yapmıştım. Symfony, rotalar yardımıyla Mapping yapar. Yani girdiğimiz URL yi bir Controller ile eşleştirir. Eğer biz http://www.symfonydemo.com/admin/book/new adresini ziyaret edersek eğer, Symfony bu URL yi BookController class ımızın new funksiyonu ile eşleştirir. Son kısım ise aşağıdadır.

 // Entity mizi çağırıyoruz.
        $book = new Book();

        // Kitabın Adı
        $book->setName("Game of Thrones");
        // Kitabın Açıklaması
        $book->setExcerpt("Taht oyunlarını oynarken orta nokta yoktur: kazanır ya da ölürsün.");
        // Kitabın Sayfa Sayısı
        $book->setPage(300);
        // Kitabın ISBN Numarası
        $book->setIsbn("6055069070");
        // Kitabın Fiyatı
        $book->setPrice(59.99);
        // Kitabın Yayınlanma tarihi. Örneğin kitap 1 ile 10 yıl arasında yayınlanmış olsun
        $book->setPublishedAt(Carbon::now()->subYears(mt_rand(1,10)));
        // Kitabın Yazarı
        $book->setAuthor("George R.R. Martin ");
        // Kitabın Sitemde Aktif mi.
        $book->setIsPublish(true);

        // Doctrine nin Nesne Yöneticisini çağırıyoruz.
        // Bu satır veritabanları işlemlerinde en önemli satırdır.
        // Bu satır yardımıyla, veritabanlarında
        // Insert, Update, Delete vb işlemleri yapıyoruz.
        $em = $this->getDoctrine()->getManager();

        // Doctrine bu bilgileri kayıt etmek istediğimizi haber veriyoruz.
        // Henüz kayıt etmedik, sorgumuzu çalıştırmadık.
        // Sadece Doctrine kayıt etmek istediğimizi söylüyoruz.
        $em->persist($book);

        // Doctrine bu bilgileri kayıt etmesini söylüyoruz.
        // Yaptığımız işleme(Insert) uygun sorgu burada çalışıyor.
        $em->flush();

        // İşlem sonunda oluşan ID yi getir.
        dump("Eklenen Kayıt ID: " . $book->getId());

        // İşlemi bitir, daha fazla devam etme..
        die();


Browser ınızı açın, http://www.symfonydemo.com/admin/book/new adresini ziyaret edin. Bu işlemi yaptıktan sonra veritabanınızı ve ilgili book adlı tabloyu kontrol ederseniz eğer bir adet kaydın eklendiğini görürsünüz.

Özet

Bu yazımda ise Symfony de Doctrine ile oluşturduğumuz veritabanına nasıl kayıt ekleriz, bundan bahsettim. Aslında Symfony Veritabanına Kayıt Ekleme zor yada karmaşık bir işlem değildir. Gördüğünüz üzere aslında çok basittir. Tabi dikkat etmemiz gereken yerleri de belirttim. Eğer adım adım yazacak olursak eğer.


  1. Entity dosyamızı çağırdık($book = new Book();).
  2. Entity dosyamızda bulunan SET methodları yardımıyla gerekli bilgileri set ettik.
  3. Devamında Doctrine Entity Manager ı çağırdık.($em = $this->getDoctrine()->getManager();).
  4. Hazırlığımızı yaptık($em->persist($book);)
  5. Ve son adımda da kayıt işlemini gerçekleştirdik.($em->flush();)

Bir sonra ki yazımda görüşmek dileği ile …