Symfony - Arbeitsbeispiel

In diesem Kapitel erfahren Sie, wie Sie eine vollständige MVC-Basis erstellen BookStore Applicationin Symfony Framework. Es folgen die Schritte.

Schritt 1: Erstellen Sie ein Projekt

Erstellen Sie mit dem folgenden Befehl ein neues Projekt mit dem Namen "BookStore" in Symfony.

symfony new BookStore

Schritt 2: Erstellen Sie einen Controller und eine Route

Erstellen Sie einen BooksController im Verzeichnis "src / AppBundle / Controller". Es ist wie folgt definiert.

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

Jetzt haben wir einen BooksController erstellt und anschließend eine Ansicht zum Rendern der Aktion erstellt.

Schritt 3: Erstellen Sie eine Ansicht

Erstellen wir einen neuen Ordner mit dem Namen "Bücher" im Verzeichnis "app / Resources / views /". Erstellen Sie im Ordner eine Datei "author.html.twig" und fügen Sie die folgenden Änderungen hinzu.

author.html.twig

<h3> Simple book store application</h3>

Rendern Sie jetzt die Ansicht in der BooksController-Klasse. Es ist wie folgt definiert.

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

Ab sofort haben wir einen einfachen BooksController erstellt und das Ergebnis wird gerendert. Sie können das Ergebnis im Browser unter der URL "http: // localhost: 8000 / books / author" überprüfen.

Schritt 4: Datenbankkonfiguration

Konfigurieren Sie die Datenbank in der Datei "app / config / parameters.yml".

Öffnen Sie die Datei und fügen Sie die folgenden Änderungen hinzu.

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

Jetzt kann Doctrine eine Verbindung zu Ihrer Datenbank "booksdb" herstellen.

Schritt 5: Erstellen Sie eine Datenbank

Geben Sie den folgenden Befehl ein, um die Datenbank "booksdb" zu generieren. Dieser Schritt wird verwendet, um die Datenbank in Doctrine zu binden.

php bin/console doctrine:database:create

Nach dem Ausführen des Befehls wird automatisch eine leere "booksdb" -Datenbank generiert. Sie können die folgende Antwort auf Ihrem Bildschirm sehen.

Es wird das folgende Ergebnis erzeugt -

Created database `booksdb` for connection named default

Schritt 6: Zuordnungsinformationen

Erstellen Sie eine Buchentitätsklasse im Entitätsverzeichnis, das sich unter "src / AppBundle / Entity" befindet.

Sie können die Buchklasse direkt mit Anmerkungen übergeben. Es ist wie folgt definiert.

Book.php

Fügen Sie der Datei den folgenden Code hinzu.

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

Hier ist der Tabellenname optional.

Wenn der Tabellenname nicht angegeben wird, wird er automatisch anhand des Namens der Entitätsklasse ermittelt.

Schritt 7: Binden Sie eine Entität

Doctrine erstellt einfache Entitätsklassen für Sie. Es hilft Ihnen beim Aufbau einer Entität.

Geben Sie den folgenden Befehl ein, um eine Entität zu generieren.

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

Dann sehen Sie das folgende Ergebnis und die Entität wird aktualisiert.

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

Schritt 8: Zuordnungsvalidierung

Nach dem Erstellen von Entitäten sollten Sie die Zuordnungen mit dem folgenden Befehl überprüfen.

php bin/console doctrine:schema:validate

Es wird das folgende Ergebnis erzeugt -

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

Da wir die Books-Tabelle nicht erstellt haben, ist die Entität nicht synchron. Lassen Sie uns im nächsten Schritt die Books-Tabelle mit dem Befehl Symfony erstellen.

Schritt 9: Schema erstellen

Doctrine kann automatisch alle Datenbanktabellen erstellen, die für die Buchentität erforderlich sind. Dies kann mit dem folgenden Befehl erfolgen.

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

Nach dem Ausführen des Befehls wird die folgende Antwort angezeigt.

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

Überprüfen Sie nun das Schema erneut mit dem folgenden Befehl.

php bin/console doctrine:schema:validate

Es wird das folgende Ergebnis erzeugt -

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

Schritt 10: Getter und Setter

Wie im Abschnitt Binden einer Entität zu sehen ist, generiert der folgende Befehl alle Getter und Setter für die Book-Klasse.

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

Schritt 11: Abrufen von Objekten aus der Datenbank

Erstellen Sie in BooksController eine Methode, mit der die Details der Bücher angezeigt werden.

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

Schritt 12: Erstellen Sie eine Ansicht

Erstellen wir eine Ansicht, die auf die Anzeige von Aktionen zeigt. Wechseln Sie in das Ansichtsverzeichnis und erstellen Sie die Datei "display.html.twig". Fügen Sie der Datei die folgenden Änderungen hinzu.

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

Sie können das Ergebnis erhalten, indem Sie im Browser die URL "http: // localhost: 8000 / books / display" anfordern.

Ergebnis

Schritt 13: Fügen Sie ein Buchformular hinzu

Erstellen wir eine Funktion zum Hinzufügen eines Buches zum System. Erstellen Sie im BooksController wie folgt eine neue Seite, newAction-Methode.

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

Schritt 14: Erstellen Sie eine Ansicht für das Buchformular

Erstellen wir eine Ansicht, die auf eine neue Aktion verweist. Wechseln Sie in das Ansichtsverzeichnis und erstellen Sie eine Datei "new.html.twig". Fügen Sie der Datei die folgenden Änderungen hinzu.

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

Es wird der folgende Bildschirm als Ausgabe erzeugt -

Schritt 15: Sammeln Sie Buchinformationen und speichern Sie sie

Lassen Sie uns die newAction-Methode ändern und den Code für die Formularübermittlung einfügen. Speichern Sie außerdem die Buchinformationen in der Datenbank.

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

Sobald das Buch in der Datenbank gespeichert ist, leiten Sie zur Buchanzeigeseite weiter.

Schritt 16: Aktualisieren des Buches

Um das Buch zu aktualisieren, erstellen Sie eine Aktion, updateAction, und fügen Sie die folgenden Änderungen hinzu.

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

Hier verarbeiten wir zwei Funktionen. Wenn die Anfrage nur eine ID enthält, holen wir sie aus der Datenbank und zeigen sie im Buchformular an. Wenn die Anfrage vollständige Buchinformationen enthält, aktualisieren wir die Details in der Datenbank und leiten sie zur Buchanzeigeseite weiter.

Schritt 17: Löschen eines Objekts

Das Löschen eines Objekts erfordert einen Aufruf der remove () -Methode des Entity (Doctrine) -Managers.

Dies kann mit dem folgenden Code erfolgen.

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

Hier haben wir das Buch gelöscht und zur Buchanzeigeseite weitergeleitet.

Schritt 18: Fügen Sie der Anzeige-Seite Funktionen zum Hinzufügen / Bearbeiten / Löschen hinzu

Aktualisieren Sie nun den Bodyblock in der Anzeigeansicht und fügen Sie die folgenden Links zum Hinzufügen / Bearbeiten / Löschen hinzu.

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

Es wird der folgende Bildschirm als Ausgabe erzeugt -

Symfony besteht aus einer Reihe von PHP-Komponenten, einem Anwendungsframework, einer Community und einer Philosophie. Symfony ist äußerst flexibel und in der Lage, alle Anforderungen fortgeschrittener Benutzer, Profis und eine ideale Wahl für alle Anfänger mit PHP zu erfüllen.