Symfony DBAL
最后修改于 2020 年 7 月 5 日
Symfony DBAL 教程演示了如何在 Symfony 应用程序中使用 Doctrine DBAL 组件来操作数据库。
Symfony
Symfony 是一套可重用的 PHP 组件和用于 Web 项目的 PHP 框架。Symfony 于 2005 年发布为自由软件。Symfony 的灵感来自 Ruby on Rails、Django 和 Spring 框架。
Doctrine DBAL 组件
Doctrine Database Abstraction Layer (DBAL) 是一个建立在 PDO 之上的抽象层,为与最流行的关系型数据库通信提供了直观而灵活的 API。DBAL 库可以轻松地执行查询和其他数据库操作。
Symfony DBAL 示例
在下面的示例中,我们创建一个简单的 Symfony 应用程序,使用 DBAL 读取数据。我们使用 MySQL 数据库。
$ symfony new symdbal
使用 symfony
CLI,我们创建一个新的 Symfony 骨架项目。
$ cd symdbal
我们进入项目目录。
$ php bin/console --version Symfony 5.0.8 (env: dev, debug: true)
我们使用的是 Symfony 版本 5.0.8。
$ composer require symfony/orm-pack
我们安装了 symfony/orm-pack
,它包含了 DBAL API。
$ composer require maker --dev
此外,我们还安装了 maker 组件。maker
包提供了脚手架功能。
CREATE TABLE countries(id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), population INT); INSERT INTO countries(name, population) VALUES('China', 1382050000); INSERT INTO countries(name, population) VALUES('India', 1313210000); INSERT INTO countries(name, population) VALUES('USA', 324666000); INSERT INTO countries(name, population) VALUES('Indonesia', 260581000); INSERT INTO countries(name, population) VALUES('Brazil', 207221000); INSERT INTO countries(name, population) VALUES('Pakistan', 196626000); INSERT INTO countries(name, population) VALUES('Nigeria', 186988000); INSERT INTO countries(name, population) VALUES('Bangladesh', 162099000); INSERT INTO countries(name, population) VALUES('Nigeria', 186988000); INSERT INTO countries(name, population) VALUES('Russia', 146838000); INSERT INTO countries(name, population) VALUES('Japan', 126830000); INSERT INTO countries(name, population) VALUES('Mexico', 122273000); INSERT INTO countries(name, population) VALUES('Philippines', 103738000);
这是用于测试的数据。它会在 MySQL 中创建一个小表。我们可以使用 source
命令执行该文件。
... DATABASE_URL=mysql://user12:s$cret@localhost:3306/mydb
在 .env
文件中,我们配置数据库 URL。
$ php bin/console make:controller HomeController
HomeController
是使用 Symfony maker 创建的。
<?php namespace App\Controller; use Doctrine\DBAL\Connection; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Annotation\Route; class HomeController extends AbstractController { /** * @Route("/home", name="home") * @param Connection $conn * @return JsonResponse */ public function index(Connection $conn): JsonResponse { $queryBuilder = $conn->createQueryBuilder(); $data = $queryBuilder->select('*')->from('countries')->execute()->fetchAll(); return $this->json([ 'data' => $data ]); } }
控制器方法执行一个查询,该查询从 countries
表中获取所有行,并将其作为 JSON 数据返回。请注意,出于简化的原因,我们将查询构建器放在了控制器中。在生产应用程序中,还应该有一个服务层和一个存储库。
public function index(Connection $conn) {
DBAL Connection
对象被注入到方法变量中。
$queryBuilder = $conn->createQueryBuilder();
我们从连接对象创建了一个 QueryBuilder
。
$data = $queryBuilder->select('*')->from('countries')->execute()->fetchAll();
我们执行查询并获取所有行。
return $this->json([ 'data' => $data ]);
数据以 JSON 格式返回。
$ symfony serve
Web 服务器已启动。
$ curl localhost:8000/home {"data":[{"id":"1","name":"China","population":"1382050000"}, {"id":"2","name":"India","population":"1313210000"}, {"id":"3","name":"USA","population":"324666000"}, {"id":"4","name":"Indonesia","population":"260581000"}, {"id":"5","name":"Brazil","population":"207221000"}, {"id":"6","name":"Pakistan","population":"196626000"}, {"id":"7","name":"Nigeria","population":"186988000"}, {"id":"8","name":"Bangladesh","population":"162099000"}, {"id":"9","name":"Nigeria","population":"186988000"}, {"id":"10","name":"Russia","population":"146838000"}, {"id":"11","name":"Japan","population":"126830000"}, {"id":"12","name":"Mexico","population":"122273000"}, {"id":"13","name":"Philippines","population":"103738000"}]}
我们使用 curl
工具执行 GET 请求。
这是一个简单的入门教程,展示了如何在 Symfony 中设置 Doctrine DBAL。