📜  Symfony-工作示例

📅  最后修改于: 2020-10-19 03:25:11             🧑  作者: Mango


在本章中,我们将学习如何在Symfony Framework中创建一个完整的基于MVC的BookStore应用程序。以下是步骤。

步骤1:建立专案

让我们使用以下命令在Symfony中创建一个名为“ BookStore”的新项目。

symfony new BookStore

步骤2:建立控制器和路径

在“ src / AppBundle / Controller”目录中创建一个BooksController。定义如下。

BooksController.php

现在,我们创建了一个BooksController,接下来创建一个视图来呈现动作。

步骤3:建立资料检视

让我们在“ app / Resources / views /”目录中创建一个名为“ Books”的新文件夹。在该文件夹内,创建文件“ author.html.twig”并添加以下更改。

author.html.twig

Simple book store application

现在,在BooksController类中渲染视图。定义如下。

BooksController.php

render('books/author.html.twig'); 
   } 
}

到目前为止,我们已经创建了一个基本的BooksController,并且呈现了结果。您可以使用URL“ http:// localhost:8000 / books / author”在浏览器中检查结果。

步骤4:数据库配置

在“ app / config / parameters.yml”文件中配置数据库。

打开文件并添加以下更改。

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_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”。

步骤5:创建数据库

发出以下命令以生成“ booksdb”数据库。此步骤用于绑定Doctrine中的数据库。

php bin/console doctrine:database:create

执行命令后,它将自动生成一个空的“ booksdb”数据库。您可以在屏幕上看到以下响应。

它将产生以下结果-

Created database `booksdb` for connection named default 

步骤6:映射信息

在位于“ src / AppBundle / Entity”的Entity目录内创建Book实体类。

您可以使用批注直接传递Book类。定义如下。

Book.php

在文件中添加以下代码。

在此,表名称是可选的。

如果未指定表名,则将根据实体类的名称自动确定表名。

步骤7:绑定实体

教义为您创建简单的实体类。它可以帮助您建立任何实体。

发出以下命令以生成实体。

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 

Book.php

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

步骤8:映射验证

创建实体后,应使用以下命令验证映射。

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表。

步骤9:创建模式

教义可以自动创建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. 

步骤10:Getter和Setter

如在绑定实体部分中所示,以下命令生成Book类的所有getter和setter。

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

步骤11:从数据库中获取对象

在BooksController中创建一个将显示书籍详细信息的方法。

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

步骤12:创建一个视图

让我们创建一个指向显示动作的视图。移至views目录并创建文件“ display.html.twig”。在文件中添加以下更改。

display.html.twig

{% extends 'base.html.twig' %} 
{% block stylesheets %} 
    
{% endblock %}  
{% block body %} 
   

Books database application!

{% for x in data %} {% endfor %}
Name Author Price
{{ x.Name }} {{ x.Author }} {{ x.Price }}
{% endblock %}

您可以通过在浏览器中请求URL“ http:// localhost:8000 / books / display”来获得结果。

结果

图书数据库应用

步骤13:添加图书表格

让我们创建一个将书添加到系统中的功能。如下创建一个新页面,即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(),)); 
} 

步骤14:为书本表单创建视图

让我们创建一个指向新动作的视图。移至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 %}

它将产生以下屏幕作为输出-

书籍详细资料

第15步:收集图书信息并将其存储

让我们更改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(), 
      )); 
   } 
}        

书籍存储到数据库后,请重定向到书籍显示页面。

步骤16:更新书籍

要更新这本书,请创建一个动作,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,则我们从数据库中获取它并以书本形式显示。并且,如果请求中包含完整的书籍信息,那么我们将更新数据库中的详细信息,然后重定向到书籍显示页面。

步骤17:删除对象

删除对象需要调用实体(主义)管理器的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'); 
} 

在这里,我们删除了图书并重定向到图书显示页面。

步骤18:在显示页面中添加添加/编辑/删除功能

现在,在显示视图中更新主体块,并包括如下添加/编辑/删除链接。

{% block body %} 
   

Books database application!

Add
{% for x in data %} {% endfor %}
Name Author Price
{{ x.Name }} {{ x.Author }} {{ x.Price }} Edit Delete
{% endblock %}

它将产生以下屏幕作为输出-

图书数据库应用

Symfony由一组PHP组件,一个应用程序框架,一个社区和一个哲学组成。 Symfony非常灵活,能够满足高级用户,专业人员的所有要求,并且是所有使用PHP的初学者的理想选择。