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.