Symfony - Contoh Kerja

Pada bab ini, kita akan mempelajari cara membuat MVC berbasis lengkap BookStore Applicationdi Symfony Framework. Berikut langkah-langkahnya.

Langkah 1: Buat Proyek

Mari buat proyek baru bernama "BookStore" di Symfony menggunakan perintah berikut.

symfony new BookStore

Langkah 2: Buat Pengontrol dan Rute

Buat BooksController di direktori “src / AppBundle / Controller”. Ini didefinisikan sebagai berikut.

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

Sekarang, kami telah membuat BooksController, selanjutnya buat tampilan untuk merender tindakan.

Langkah 3: Buat Tampilan

Mari buat folder baru bernama "Books" di direktori "app / Resources / views /". Di dalam folder, buat file "author.html.twig" dan tambahkan perubahan berikut.

author.html.twig

<h3> Simple book store application</h3>

Sekarang, render tampilan di kelas BooksController. Ini didefinisikan sebagai berikut.

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

Sampai sekarang, kami telah membuat BooksController dasar dan hasilnya ditampilkan. Anda dapat memeriksa hasilnya di browser menggunakan URL "http: // localhost: 8000 / books / author".

Langkah 4: Konfigurasi Database

Konfigurasikan database di file "app / config / parameter.yml".

Buka file dan tambahkan perubahan berikut.

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

Sekarang, Doctrine dapat terhubung ke database "booksdb" Anda.

Langkah 5: Buat Database

Keluarkan perintah berikut untuk menghasilkan database "booksdb". Langkah ini digunakan untuk mengikat database di Doktrin.

php bin/console doctrine:database:create

Setelah menjalankan perintah, secara otomatis menghasilkan database "booksdb" kosong. Anda dapat melihat respon berikut di layar Anda.

Ini akan menghasilkan hasil sebagai berikut -

Created database `booksdb` for connection named default

Langkah 6: Memetakan Informasi

Buat kelas entitas Buku di dalam direktori Entitas yang terletak di "src / AppBundle / Entity".

Anda dapat langsung lulus kelas Buku menggunakan anotasi. Ini didefinisikan sebagai berikut.

Book.php

Tambahkan kode berikut di file.

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

Di sini, nama tabel bersifat opsional.

Jika nama tabel tidak ditentukan, maka akan ditentukan secara otomatis berdasarkan nama kelas entitas.

Langkah 7: Ikat Entitas

Doctrine menciptakan kelas entitas sederhana untuk Anda. Ini membantu Anda membangun entitas apa pun.

Berikan perintah berikut untuk menghasilkan entitas.

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

Kemudian Anda akan melihat hasil berikut dan entitas akan diperbarui.

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

Langkah 8: Memetakan Validasi

Setelah membuat entitas, Anda harus memvalidasi pemetaan menggunakan perintah berikut.

php bin/console doctrine:schema:validate

Ini akan menghasilkan hasil sebagai berikut -

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

Karena kami belum membuat tabel Buku, entitas tersebut tidak sinkron. Mari kita membuat tabel Buku menggunakan perintah Symfony di langkah berikutnya.

Langkah 9: Membuat Skema

Doctrine secara otomatis dapat membuat semua tabel database yang dibutuhkan untuk entitas Book. Ini dapat dilakukan dengan menggunakan perintah berikut.

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

Setelah menjalankan perintah, Anda akan melihat respons berikut.

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

Sekarang, validasi skema lagi menggunakan perintah berikut.

php bin/console doctrine:schema:validate

Ini akan menghasilkan hasil sebagai berikut -

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

Langkah 10: Getter dan Setter

Seperti yang terlihat di bagian Ikat Entitas, perintah berikut menghasilkan semua pengambil dan penyetel untuk kelas Buku.

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

Langkah 11: Mengambil Objek dari Database

Buat metode di BooksController yang akan menampilkan detail buku.

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

Langkah 12: Buat Tampilan

Mari buat tampilan yang menunjukkan aksi. Pindah ke direktori views dan buat file “display.html.twig”. Tambahkan perubahan berikut pada file.

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

Anda bisa mendapatkan hasilnya dengan meminta URL "http: // localhost: 8000 / books / display" di browser.

Hasil

Langkah 13: Tambahkan Formulir Buku

Mari buat fungsionalitas untuk menambahkan buku ke dalam sistem. Buat halaman baru, metode newAction di BooksController sebagai berikut.

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

Langkah 14: Buat Formulir Tampilan Untuk Buku

Mari buat tampilan yang mengarah ke tindakan baru. Pindah ke direktori views dan buat file “new.html.twig”. Tambahkan perubahan berikut pada file.

{% 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 %}

Ini akan menghasilkan layar berikut sebagai output -

Langkah 15: Kumpulkan Informasi Buku dan Simpan

Mari ubah metode newAction dan sertakan kode untuk menangani pengiriman formulir. Selain itu, simpan informasi buku ke dalam database.

/**
   * @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(), 
      )); 
   } 
}

Setelah buku disimpan ke database, arahkan ke halaman tampilan buku.

Langkah 16: Memperbarui Buku

Untuk memperbarui buku, buat tindakan, updateAction, dan tambahkan perubahan berikut.

/** 
   * @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(), 
      )); 
   } 
}

Di sini, kami memproses dua fungsi. Jika request hanya berisi id, maka kita mengambilnya dari database dan menampilkannya di form book. Dan, jika permintaan berisi informasi buku lengkap, maka kami memperbarui detailnya di database dan mengarahkan ke halaman tampilan buku.

Langkah 17: Menghapus Objek

Menghapus sebuah objek membutuhkan panggilan ke metode remove () dari manajer entitas (doktrin).

Ini dapat dilakukan dengan menggunakan kode berikut.

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

Di sini, kami menghapus buku dan diarahkan ke halaman tampilan buku.

Langkah 18: Sertakan Fungsi Tambah / Edit / Hapus di Halaman Tampilan

Sekarang, perbarui blok tubuh dalam tampilan tampilan dan sertakan tautan tambahkan / edit / hapus sebagai berikut.

{% 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 %}

Ini akan menghasilkan layar berikut sebagai output -

Symfony terdiri dari sekumpulan komponen PHP, kerangka aplikasi, komunitas, dan filosofi. Symfony sangat fleksibel dan mampu memenuhi semua kebutuhan pengguna tingkat lanjut, profesional, dan pilihan ideal untuk semua pemula dengan PHP.