📅  最后修改于: 2020-10-19 03:25:11             🧑  作者: Mango
在本章中,我们将学习如何在Symfony Framework中创建一个完整的基于MVC的BookStore应用程序。以下是步骤。
让我们使用以下命令在Symfony中创建一个名为“ BookStore”的新项目。
symfony new BookStore
在“ src / AppBundle / Controller”目录中创建一个BooksController。定义如下。
现在,我们创建了一个BooksController,接下来创建一个视图来呈现动作。
让我们在“ app / Resources / views /”目录中创建一个名为“ Books”的新文件夹。在该文件夹内,创建文件“ author.html.twig”并添加以下更改。
Simple book store application
现在,在BooksController类中渲染视图。定义如下。
render('books/author.html.twig');
}
}
到目前为止,我们已经创建了一个基本的BooksController,并且呈现了结果。您可以使用URL“ http:// localhost:8000 / books / author”在浏览器中检查结果。
在“ app / config / parameters.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_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
现在,Doctrine可以连接到数据库“ booksdb”。
发出以下命令以生成“ booksdb”数据库。此步骤用于绑定Doctrine中的数据库。
php bin/console doctrine:database:create
执行命令后,它将自动生成一个空的“ booksdb”数据库。您可以在屏幕上看到以下响应。
它将产生以下结果-
Created database `booksdb` for connection named default
在位于“ src / AppBundle / Entity”的Entity目录内创建Book实体类。
您可以使用批注直接传递Book类。定义如下。
在文件中添加以下代码。
在此,表名称是可选的。
如果未指定表名,则将根据实体类的名称自动确定表名。
教义为您创建简单的实体类。它可以帮助您建立任何实体。
发出以下命令以生成实体。
php bin/console doctrine:generate:entities AppBundle/Entity/Book
然后,您将看到以下结果,并且实体将被更新。
Generating entity "AppBundle\Entity\Book”
> backing up Book.php to Book.php~
> generating AppBundle\Entity\Book
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;
}
}
创建实体后,应使用以下命令验证映射。
php bin/console doctrine:schema:validate
它将产生以下结果-
[Mapping] OK - The mapping files are correct
[Database] FAIL - The database schema is not in sync with the current mapping file.
由于我们尚未创建Books表,因此该实体不同步。在下一步中,让我们使用Symfony命令创建Books表。
教义可以自动创建Book实体所需的所有数据库表。可以使用以下命令完成此操作。
php bin/console doctrine:schema:update --force
执行命令后,您将看到以下响应。
Updating database schema...
Database schema updated successfully! "1" query was executed
现在,再次使用以下命令验证架构。
php bin/console doctrine:schema:validate
它将产生以下结果-
[Mapping] OK - The mapping files are correct.
[Database] OK - The database schema is in sync with the mapping files.
如在绑定实体部分中所示,以下命令生成Book类的所有getter和setter。
$ php bin/console doctrine:generate:entities AppBundle/Entity/Book
在BooksController中创建一个将显示书籍详细信息的方法。
/**
* @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));
}
让我们创建一个指向显示动作的视图。移至views目录并创建文件“ display.html.twig”。在文件中添加以下更改。
{% extends 'base.html.twig' %}
{% block stylesheets %}
{% endblock %}
{% block body %}
Books database application!
Name
Author
Price
{% for x in data %}
{{ x.Name }}
{{ x.Author }}
{{ x.Price }}
{% endfor %}
{% endblock %}
您可以通过在浏览器中请求URL“ http:// localhost:8000 / books / display”来获得结果。
让我们创建一个将书添加到系统中的功能。如下创建一个新页面,即BooksController中的newAction方法。
// 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(),));
}
让我们创建一个指向新动作的视图。移至views目录并创建一个文件“ new.html.twig”。在文件中添加以下更改。
{% extends 'base.html.twig' %}
{% block stylesheets %}
{% endblock %}
{% block body %}
Book details:
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
{% endblock %}
它将产生以下屏幕作为输出-
让我们更改newAction方法,并包括处理表单提交的代码。另外,将书籍信息存储到数据库中。
/**
* @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(),
));
}
}
书籍存储到数据库后,请重定向到书籍显示页面。
要更新这本书,请创建一个动作,updateAction并添加以下更改。
/**
* @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(),
));
}
}
在这里,我们正在处理两个功能。如果请求仅包含id,则我们从数据库中获取它并以书本形式显示。并且,如果请求中包含完整的书籍信息,那么我们将更新数据库中的详细信息,然后重定向到书籍显示页面。
删除对象需要调用实体(主义)管理器的remove()方法。
可以使用以下代码完成。
/**
* @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');
}
在这里,我们删除了图书并重定向到图书显示页面。
现在,在显示视图中更新主体块,并包括如下添加/编辑/删除链接。
{% block body %}
Books database application!
Name
Author
Price
{% for x in data %}
{{ x.Name }}
{{ x.Author }}
{{ x.Price }}
Edit
Delete
{% endfor %}
{% endblock %}
它将产生以下屏幕作为输出-
Symfony由一组PHP组件,一个应用程序框架,一个社区和一个哲学组成。 Symfony非常灵活,能够满足高级用户,专业人员的所有要求,并且是所有使用PHP的初学者的理想选择。