📅  最后修改于: 2020-10-19 03:17:07             🧑  作者: Mango
在Symfony Web框架中,模型扮演着重要角色。他们是业务实体。它们可以由客户提供,也可以从后端数据库中获取,然后根据业务规则进行操作并保存回数据库中。它们是视图提供的数据。在本章中,让我们了解模型以及它们如何与后端系统交互。
我们需要将模型映射到后端关系数据库项,以安全有效地获取和保留模型。可以使用对象关系映射(ORM)工具完成此映射。 Symfony提供了一个单独的捆绑包DoctrineBundle ,该捆绑包将Symfony与第三方PHP数据库ORM工具Doctrine集成在一起。
默认情况下,Symfony框架不提供任何与数据库一起使用的组件。但是,它与Doctrine ORM紧密集成。教义包含几个用于数据库存储和对象映射的PHP库。
以下示例将帮助您了解Doctrine的工作原理,如何配置数据库以及如何保存和检索数据。
在此示例中,我们将首先配置数据库并创建一个Student对象,然后在其中执行一些操作。
为此,我们需要遵循以下步骤。
使用以下命令创建一个Symfony应用程序dbsample 。
symfony new dbsample
通常,数据库信息在“ app / config / parameters.yml”文件中进行配置。
打开文件并添加以下更改。
parameter.yml
parameters:
database_host: 127.0.0.1
database_port: null
database_name: studentsdb
database_user:
database_password:
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
secret: 037ab82c601c10402408b2b190d5530d602b5809
doctrine:
dbal:
driver: pdo_mysql
host: '%database_host%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: utf8mb4
现在,Doctrine ORM可以连接到数据库。
发出以下命令以生成“ studentsdb”数据库。此步骤用于在Doctrine ORM中绑定数据库。
php bin/console doctrine:database:create
执行命令后,它将自动生成一个空的“ studentsdb”数据库。您可以在屏幕上看到以下响应。
Created database `studentsdb` for connection named default
映射信息不过是“元数据”,它是一组规则的集合,这些规则可以准确地告知Doctrine ORM如何将Student类及其属性映射到特定的数据库表。
嗯,可以用多种不同的格式(包括YAML,XML)指定此元数据,也可以使用批注直接传递Student类。定义如下。
在文件中添加以下更改。
在此,表名称是可选的。如果未指定表名,则将根据实体类的名称自动确定表名。
教义为您创建简单的实体类。它可以帮助您建立任何实体。
发出以下命令以生成实体。
php bin/console doctrine:generate:entities AppBundle/Entity/Student
然后,您将看到以下结果,并且实体将被更新。
Generating entity "AppBundle\Entity\Student"
> backing up Student.php to Student.php~
> generating AppBundle\Entity\Student
id;
}
/**
* Set name
*
* @param string $name
*
* @return Student
*/
public function setName($name) {
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName() {
return $this->name;
}
/**
* Set address
*
* @param string $address
*
* @return Student
*/
public function setAddress($address) {
$this->address = $address;
return $this;
}
/**
* Get address
*
* @return string
*/
public function getAddress() {
return $this->address;
}
}
创建实体后,应使用以下命令验证映射。
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
由于尚未创建students表,因此该实体不同步。让我们在下一步中使用Symfony命令创建students表。
教义可以自动创建学生实体所需的所有数据库表。可以使用以下命令完成此操作。
php bin/console doctrine:schema:update --force
执行命令后,您可以看到以下响应。
Updating database schema...
Database schema updated successfully! "1" query was executed
该命令将数据库的外观与实际外观进行比较,并执行将数据库模式更新到应有的位置所需的SQL语句。
现在,再次使用以下命令验证架构。
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
如在绑定实体部分中所示,以下命令生成Student类的所有getter和setter。
$ php bin/console doctrine:generate:entities AppBundle/Entity/Student
现在,我们已经将Student实体映射到其对应的Student表。现在,我们应该能够将Student对象持久化到数据库中。将以下方法添加到包的StudentController中。
setName('Adam');
$stud->setAddress('12 north street');
$doct = $this->getDoctrine()->getManager();
// tells Doctrine you want to save the Product
$doct->persist($stud);
//executes the queries (i.e. the INSERT query)
$doct->flush();
return new Response('Saved new student with id ' . $stud->getId());
}
}
在这里,我们通过基本控制器的getDoctrine()使用getManager()方法访问了教义管理器,然后使用教义管理器的persist()方法持久化了当前对象。 persist()方法将命令添加到队列中,但是flush()方法却可以完成实际工作(保留学生对象)。
在StudentController中创建一个函数,该函数将显示学生详细信息。
StudentController.php
/**
* @Route("/student/display")
*/
public function displayAction() {
$stud = $this->getDoctrine()
->getRepository('AppBundle:Student')
->findAll();
return $this->render('student/display.html.twig', array('data' => $stud));
}
让我们创建一个指向显示动作的视图。移至views目录并创建文件“ display.html.twig”。在文件中添加以下更改。
display.html.twig
Students database application!
Name
Address
{% for x in data %}
{{ x.Name }}
{{ x.Address }}
{% endfor %}
您可以通过在浏览器中请求URL“ http:// localhost:8000 / student / display”来获得结果。
它将在屏幕上产生以下输出-
要在StudentController中更新对象,请创建一个动作并添加以下更改。
/**
* @Route("/student/update/{id}")
*/
public function updateAction($id) {
$doct = $this->getDoctrine()->getManager();
$stud = $doct->getRepository('AppBundle:Student')->find($id);
if (!$stud) {
throw $this->createNotFoundException(
'No student found for id '.$id
);
}
$stud->setAddress('7 south street');
$doct->flush();
return new Response('Changes updated!');
}
现在,请求URL“ http:// localhost:8000 / Student / update / 1”,它将产生以下结果。
它将在屏幕上产生以下输出-
删除对象是相似的,它需要调用实体(主义)管理器的remove()方法。
可以使用以下命令完成此操作。
/**
* @Route("/student/delete/{id}")
*/
public function deleteAction($id) {
$doct = $this->getDoctrine()->getManager();
$stud = $doct->getRepository('AppBundle:Student')->find($id);
if (!$stud) {
throw $this->createNotFoundException('No student found for id '.$id);
}
$doct->remove($stud);
$doct->flush();
return new Response('Record deleted!');
}