Symfony - Çalışma Örneği

Bu bölümde, MVC tabanlı eksiksiz bir MVC oluşturmayı öğreneceğiz. BookStore ApplicationSymfony Framework'te. Adımlar aşağıdadır.

Adım 1: Bir Proje Oluşturun

Aşağıdaki komutu kullanarak Symfony'de “BookStore” adında yeni bir proje oluşturalım.

symfony new BookStore

2. Adım: Bir Denetleyici ve Rota Oluşturun

"Src / AppBundle / Controller" dizininde bir BooksController oluşturun. Aşağıdaki gibi tanımlanır.

BooksController.php

<?php  
namespace AppBundle\Controller;  

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

class BooksController { 
   /** 
      * @Route("/books/author") 
   */ 
   public function authorAction() { 
      return new Response('Book store application!'); 
   } 
}

Şimdi, bir BooksController oluşturduk, ardından eylemi işlemek için bir görünüm oluşturalım.

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

"App / Resources / views /" dizininde "Books" adında yeni bir klasör oluşturalım. Klasörün içinde bir “author.html.twig” dosyası oluşturun ve aşağıdaki değişiklikleri ekleyin.

author.html.twig

<h3> Simple book store application</h3>

Şimdi, görünümü BooksController sınıfında işleyin. Aşağıdaki gibi tanımlanır.

BooksController.php

<?php  
namespace AppBundle\Controller;  

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

class BooksController extends Controller { 
   /** 
      * @Route("/books/author") 
   */ 
   public function authorAction() { 
      return $this->render('books/author.html.twig'); 
   } 
}

Şu andan itibaren, temel bir BooksController oluşturduk ve sonuç işlendi. Sonucu tarayıcıda “http: // localhost: 8000 / kitaplar / yazar” URL'sini kullanarak kontrol edebilirsiniz.

Adım 4: Veritabanı Yapılandırması

Veritabanını "app / config / parameters.yml" dosyasında yapılandırın.

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

parameter.yml

# This file is auto-generated during the composer install  
parameters: 
   database_driver: pdo_mysql 
   database_host: localhost 
   database_port: 3306 
   database_name: booksdb 
   database_user: <database_username> 
   database_password: <database_password> 
   mailer_transport: smtp 
   mailer_host: 127.0.0.1 
   mailer_user: null 
   mailer_password: null 
   secret: 0ad4b6d0676f446900a4cb11d96cf0502029620d 
   
   doctrine: 
      dbal: 
      driver:   pdo_mysql 
      host:     '%database_host%' 
      dbname:   '%database_name%' 
      user:     '%database_user%' 
      password: '%database_password%' 
      charset: utf8mb4

Artık Doctrine "booksdb" veritabanınıza bağlanabilir.

Adım 5: Veritabanı Oluşturun

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

php bin/console doctrine:database:create

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

Aşağıdaki sonucu verecektir -

Created database `booksdb` for connection named default

Adım 6: Eşleme Bilgileri

"Src / AppBundle / Entity" konumunda bulunan Varlık dizini içinde bir Kitap varlık sınıfı oluşturun.

Notları kullanarak doğrudan Kitap sınıfını geçebilirsiniz. Aşağıdaki gibi tanımlanır.

Book.php

Aşağıdaki kodu dosyaya ekleyin.

<?php 
namespace AppBundle\Entity; 
use Doctrine\ORM\Mapping as ORM;  

/** 
   * @ORM\Entity 
   * @ORM\Table(name = "Books") 
*/  
class Book { 
   /** 
      * @ORM\Column(type = "integer") 
      * @ORM\Id 
      * @ORM\GeneratedValue(strategy = "AUTO") 
   */ 
   private $id;  
   
   /** 
      * @ORM\Column(type = "string", length = 50) 
   */ 
   private $name;  
    
   /** 
      * @ORM\Column(type = "string", length = 50) 
   */ 
      
   private $author;
   /** 
      * @ORM\Column(type = "decimal", scale = 2) 
   */ 
   private $price; 
}

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.

7. Adım: 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/Book

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

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

Book.php

<?php  
namespace AppBundle\Entity;  

use Doctrine\ORM\Mapping as ORM;  
/** 
   * @ORM\Entity 
   * @ORM\Table(name = "Books") 
*/ 
class Book { 
   /** 
      * @ORM\Column(type = "integer") 
      * @ORM\Id
      * @ORM\GeneratedValue(strategy = "AUTO") 
   */ 
   private $id;  
    
   /** 
      * @ORM\Column(type = "string", length = 50) 
   */ 
   private $name;  
    
   /** 
      * @ORM\Column(type = "string", length = 50) 
   */ 
   private $author;  
    
   /** 
      * @ORM\Column(type = "decimal", scale = 2) 
   */ 
   private $price;  
    
   /** 
      * Get id 
      * 
      * @return integer 
   */ 
   public function getId() { 
      return $this->id; 
   }  
   
   /** 
      * Set name 
      * 
      * @param string $name 
      * 
      * @return Book 
   */
   public function setName($name) { 
      $this->name = $name; 
      return $this; 
   }  
    
   /** 
      * Get name 
      * 
      * @return string 
   */ 
   public function getName() { 
      return $this->name; 
   }  
    
   /** 
      * Set author 
      * 
      * @param string $author 
      * 
      * @return Book 
   */ 
   public function setAuthor($author) { 
      $this->author = $author; 
      return $this; 
   }  
    
   /** 
      * Get author 
      * 
      * @return string 
   */ 
   public function getAuthor() {
      return $this->author; 
   }  
   
   /** 
      * Set price 
      * 
      * @param string $price 
      * 
      * @return Book 
   */ 
   public function setPrice($price) { 
      $this->price = $price; 
      return $this; 
   }  
    
   /** 
      * Get price 
      * 
      * @return string 
   */ 
   public function getPrice() { 
      return $this->price; 
   } 
}

Adım 8: Eşleme 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.

Kitaplar tablosunu oluşturmadığımız için varlık senkronize değil. Bir sonraki adımda Symfony komutunu kullanarak Books tablosunu oluşturalım.

Adım 9: Şema Oluşturma

Doctrine, Book 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öreceksiniz.

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

Ş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 10: Alıcı ve Ayarlayıcı

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

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

Adım 11: Veritabanından Nesneleri Getirme

BooksController'da kitapların ayrıntılarını görüntüleyecek bir yöntem oluşturun.

BooksController.php

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

Adım 12: 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 "display.html.twig" dosyasını oluşturun. Dosyaya aşağıdaki değişiklikleri ekleyin.

display.html.twig

{% extends 'base.html.twig' %} 
{% block stylesheets %} 
   <style> 
      .table { border-collapse: collapse; } 
      .table th, td { 
         border-bottom: 1px solid #ddd; 
         width: 250px; 
         text-align: left; 
         align: left; 
      } 
   </style> 
{% endblock %}  
{% block body %} 
   <h2>Books database application!</h2>  
   <table class = "table">  
      <tr>  
         <th>Name</th>  
         <th>Author</th>  
         <th>Price</th>  
      </tr>  
      {% for x in data %} 
      <tr>  
         <td>{{ x.Name }}</td>   
         <td>{{ x.Author }}</td>
         <td>{{ x.Price }}</td>  
      </tr>  
      {% endfor %} 
   </table> 
{% endblock %}

Sonucu, tarayıcıda “http: // localhost: 8000 / books / display” URL'sini talep ederek elde edebilirsiniz.

Sonuç

Adım 13: Bir Kitap Formu Ekleyin

Sisteme kitap eklemek için bir işlevsellik oluşturalım. BooksController'da aşağıdaki gibi yeni bir sayfa, newAction yöntemi oluşturun.

// use section 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType;  

// methods section 
/** 
   * @Route("/books/new") 
*/ 

public function newAction(Request $request) { 
   $stud = new StudentForm();
      $form = $this->createFormBuilder($stud) 
         ->add('name', TextType::class) 
         ->add('author', TextType::class) 
         ->add('price', TextType::class) 
         ->add('save', SubmitType::class, array('label' => 'Submit')) 
         ->getForm();  
   return $this->render('books/new.html.twig', array('form' => $form->createView(),)); 
}

Adım 14: Kitap Formu İçin Bir Görünüm Oluşturun

Yeni bir eyleme işaret eden bir bakış açısı oluşturalım. Views dizinine gidin ve bir “new.html.twig” dosyası oluşturun. Dosyaya aşağıdaki değişiklikleri ekleyin.

{% extends 'base.html.twig' %} 
{% block stylesheets %} 
   <style> 
      #simpleform { 
         width:600px; 
         border:2px solid grey; 
         padding:14px; 
      } 
      #simpleform label { 
         font-size:14px; 
         float:left; 
         width:300px; 
         text-align:right; 
         display:block; 
      } 
      #simpleform span { 
         font-size:11px; 
         color:grey;
         width:100px; 
         text-align:right; 
         display:block; 
      }  
      #simpleform input { 
         border:1px solid grey; 
         font-family:verdana; 
         font-size:14px; 
         color:light blue; 
         height:24px; 
         width:250px; 
         margin: 0 0 10px 10px; 
      }  
      #simpleform textarea { 
         border:1px solid grey; 
         font-family:verdana; 
         font-size:14px; 
         color:light blue; 
         height:120px; 
         width:250px; 
         margin: 0 0 20px 10px; 
      }  
      #simpleform select { 
         margin: 0 0 20px 10px; 
      } 
      #simpleform button { 
         clear:both; 
         margin-left:250px; 
         background: grey;
         color:#FFFFFF; 
         border:solid 1px #666666; 
         font-size:16px; 
      } 
   </style> 
{% endblock %}  
{% block body %} 
   <h3>Book details:</h3> 
   <div id = "simpleform"> 
      {{ form_start(form) }} 
      {{ form_widget(form) }} 
      {{ form_end(form) }} 
   </div> 
{% endblock %}

Çıktı olarak aşağıdaki ekranı üretecektir -

15. Adım: Kitap Bilgilerini Toplayın ve Saklayın

NewAction yöntemini değiştirelim ve form gönderimini işlemek için kodu dahil edelim. Ayrıca kitap bilgilerini veritabanında saklayın.

/**
   * @Route("/books/new", name="app_book_new") 
*/ 
public function newAction(Request $request) { 
   $book = new Book(); 
   $form = $this->createFormBuilder($book) 
      ->add('name', TextType::class) 
      ->add('author', TextType::class) 
      ->add('price', TextType::class) 
      ->add('save', SubmitType::class, array('label' => 'Submit')) 
      ->getForm();  
   
   $form->handleRequest($request);  
   
   if ($form->isSubmitted() && $form->isValid()) { 
      $book = $form->getData(); 
      $doct = $this->getDoctrine()->getManager();  
      
      // tells Doctrine you want to save the Product 
      $doct->persist($book);  
      
      //executes the queries (i.e. the INSERT query) 
      $doct->flush();  
      
      return $this->redirectToRoute('app_book_display'); 
   } else { 
      return $this->render('books/new.html.twig', array( 
         'form' => $form->createView(), 
      )); 
   } 
}

Kitap veri tabanına kaydedildikten sonra kitap görüntüleme sayfasına yeniden yönlendirin.

Adım 16: Kitabın Güncellenmesi

Kitabı güncellemek için bir eylem oluşturun, updateAction'ı yapın ve aşağıdaki değişiklikleri ekleyin.

/** 
   * @Route("/books/update/{id}", name = "app_book_update" ) 
*/ 
public function updateAction($id, Request $request) { 
   $doct = $this->getDoctrine()->getManager(); 
   $bk = $doct->getRepository('AppBundle:Book')->find($id);  
    
   if (!$bk) { 
      throw $this->createNotFoundException( 
         'No book found for id '.$id 
      ); 
   }  
   $form = $this->createFormBuilder($bk) 
      ->add('name', TextType::class) 
      ->add('author', TextType::class) 
      ->add('price', TextType::class) 
      ->add('save', SubmitType::class, array('label' => 'Submit')) 
      ->getForm();  
   
   $form->handleRequest($request);  
   
   if ($form->isSubmitted() && $form->isValid()) { 
      $book = $form->getData(); 
      $doct = $this->getDoctrine()->getManager();  
      
      // tells Doctrine you want to save the Product 
      $doct->persist($book);  
        
      //executes the queries (i.e. the INSERT query) 
      $doct->flush(); 
      return $this->redirectToRoute('app_book_display'); 
   } else {  
      return $this->render('books/new.html.twig', array(
         'form' => $form->createView(), 
      )); 
   } 
}

Burada iki işlevi işliyoruz. İstek sadece id içeriyorsa, bunu veritabanından alır ve kitap formunda gösteririz. Ve eğer talep tam kitap bilgisi içeriyorsa, veritabanındaki ayrıntıları günceller ve kitap görüntüleme sayfasına yönlendiririz.

Adım 17: Bir Nesneyi Silme

Bir nesnenin silinmesi, varlık (doktrin) yöneticisinin remove () yöntemine bir çağrı gerektirir.

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

/** 
   * @Route("/books/delete/{id}", name="app_book_delete") 
*/ 
public function deleteAction($id) { 
   $doct = $this->getDoctrine()->getManager(); 
   $bk = $doct->getRepository('AppBundle:Book')->find($id); 
   
   if (!$bk) { 
      throw $this->createNotFoundException('No book found for id '.$id); 
   } 
   $doct->remove($bk); 
   $doct->flush(); 
   return $this->redirectToRoute('app_book_display'); 
}

Burada kitabı sildik ve kitap görüntüleme sayfasına yönlendirildik.

Adım 18: Ekleme / Düzenleme / Silme İşlevini Görüntüleme Sayfasına Dahil Et

Şimdi, gövde bloğunu ekran görünümünde güncelleyin ve aşağıdaki gibi ekleme / düzenleme / silme bağlantılarını dahil edin.

{% block body %} 
   <h2>Books database application!</h2> 
   <div> 
      <a href = "{{ path('app_book_new') }}">Add</a> 
   </div> 
   <table class = "table">  
      <tr>  
         <th>Name</th>  
         <th>Author</th>  
         <th>Price</th> 
         <th></th> 
         <th></th> 
      </tr>  
      {% for x in data %} 
      <tr>  
         <td>{{ x.Name }}</td>   
         <td>{{ x.Author }}</td>   
         <td>{{ x.Price }}</td>   
         <td><a href = "{{ path('app_book_update', { 'id' : x.Id }) }}">Edit</a></td>
         <td><a href = "{{ path('app_book_delete', { 'id' : x.Id }) }}">Delete</a></td>
      </tr>  
      {% endfor %} 
   </table>  
{% endblock %}

Çıktı olarak aşağıdaki ekranı üretecektir -

Symfony, bir dizi PHP bileşeninden, bir uygulama çerçevesinden, bir topluluktan ve bir felsefeden oluşur. Symfony son derece esnektir ve ileri düzey kullanıcıların, profesyonellerin tüm gereksinimlerini karşılayabilir ve PHP'ye yeni başlayanlar için ideal bir seçimdir.