Docs 菜单
Docs 主页
/
MongoDB 驱动程序
/

Symfony MongoDB 集成

在此页面上

  • 概述
  • 为何在 Symfony 应用程序中使用 MongoDB?
  • 快速入门
  • 先决条件
  • 创建 MongoDB Atlas 集群
  • 安装 MongoDB 扩展
  • 初始化 Symfony 项目
  • 安装 PHP 驱动程序和 Doctrine ODM
  • 安装前端依赖项
  • 修改项目文件
  • 启动您的 Symfony 应用程序
  • 资源

在本指南中,您可以了解 Symfony MongoDB 集成以及如何使用此框架构建简单的 PHP Web 应用程序。您可以了解使用 Symfony 构建以 MongoDB 作为数据库的 Web 应用程序的好处,并练习使用可简化 MongoDB 查询的库。

Symfony 是一个灵活且高度可配置的框架,用于构建 PHP 应用程序。您可以使用此框架创建可重用的组件,以简化您的 Web 应用程序。

本指南的快速入门部分包含一个教程,您可以按照该教程构建一个用于访问 MongoDB 集合中的数据的单页面应用程序。

参考资料部分包含可供进一步学习的资源和文档链接。

通过将 MongoDB 用作 Symfony Web 应用程序中的数据存储,您可以利用文档数据模型来构建丰富的查询表达式,从而轻松地与数据进行交互。您还可以自定义连接,以持久保存与多个数据库和集合之间的数据访问。

在您的应用程序中,您可以实现Doctrine MongoDB ODM ,它是适用于 MongoDB 和 PHP 的对象文档映射器 (ODM)。它提供了一种在 Symfony 中使用 MongoDB 的方法,使用与关系数据库的 Doctrine ORM 相同的原理。

Doctrine ODM 允许您将 PHP 对象映射到 MongoDB 文档,并使用构建器 API 查询 MongoDB。通过这种映射,您可以使用其他 MongoDB 功能,例如灵活的模式设计和高级搜索。要了解有关此库的更多信息,请参阅参考资料部分。

本教程向您展示如何使用 PHP 框架 Symfony 构建 Web 应用程序。它包括有关连接到 MongoDB Atlas 上托管的 MongoDB 集群以及访问和显示数据库中的数据的说明。

通过将 MongoDB 用作 Symfony Web 应用程序中的数据存储,您可以利用文档数据模型来构建丰富的查询表达式,从而轻松地与数据进行交互。

提示

如果您更愿意使用 MongoDB PHP 库而不是 Symfony连接到 MongoDB ,请参阅 MongoDB PHP 库文档中的连接到 MongoDB。

MongoDB Atlas 是完全托管的云数据库服务,旨在托管您的 MongoDB 部署。您可以按照本指南中的步骤创建您的免费(无需信用卡)MongoDB Atlas 部署。

本指南使用 Doctrine ODM,允许您将 PHP 对象映射到 MongoDB 文档,并使用构建器 API 查询 MongoDB。

按照本指南中的步骤创建一个示例 Symfony Web 应用程序,该应用程序连接到 MongoDB 部署并对数据库执行查询。

要创建快速入门应用程序,您需要在开发环境中安装以下软件:

您必须创建一个 MongoDB 集群,以便在其中存储和管理数据。完成Atlas 入门指南,设置新的 Atlas 帐户并创建免费套餐 MongoDB 集群。本教程还演示了如何将示例数据集加载到集群中,包括本教程中使用的数据。

您可以通过为驱动程序提供连接字符串来指示连接到 MongoDB 集群的位置和方式。要检索连接字符串,请按照 Atlas 文档中的“连接到集群”教程中的说明进行操作。

提示

将连接字符串保存在安全位置。

要了解有关安装 MongoDB 扩展的更多信息,请参阅 PHP 库手册中的安装扩展

运行以下命令以创建名为 restaurants的 Symfony 项目框架:

composer create-project symfony/skeleton restaurants

进入您的项目目录,然后将 MongoDB PHP 驱动程序和 Doctrine ODM 捆绑包添加到您的应用程序中。该捆绑包将 ODM 库集成到 Symfony 中,以便您可以在 MongoDB 中读取和写入对象。安装捆绑包还会自动将驱动程序添加到项目中。要了解更多信息,请参阅本指南的“参考资料”部分。

运行以下命令以安装 ODM:

composer require doctrine/mongodb-odm-bundle

提示

运行上述命令后,您可能会看到以下提示:

Do you want to execute this recipe?

从响应选项中选择yes ,将 ODM 库添加到您的应用程序中。

要确保在您的项目中启用了 Doctrine ODM,请验证您的config/bundles.php文件是否包含以下代码中突出显示的条目:

config/bundles.php
return [
// ...
Doctrine\Bundle\MongoDBBundle\DoctrineMongoDBBundle::class => ['all' => true],
];

config/packages目录中,将doctrine_mongodb.yaml文件的内容替换为以下代码:

config/packages/doctrine_mongodb.yaml
doctrine_mongodb:
auto_generate_proxy_classes: true
auto_generate_hydrator_classes: true
connections:
default:
server: "%env(resolve:MONGODB_URL)%"
default_database: "%env(resolve:MONGODB_DB)%"
document_managers:
default:
auto_mapping: true
mappings:
App:
dir: "%kernel.project_dir%/src/Document"
mapping: true
type: attribute
prefix: 'App\Document'
is_bundle: false
alias: App

此项目使用twig (Symfony 的默认模板引擎)在此应用程序中生成模板。运行以下命令以安装twig捆绑包:

composer require symfony/twig-bundle

注意

此步骤可能会导致出现有关未设置环境变量的错误消息,但此问题已在以下步骤中得到解决。

本部分演示如何修改restaurants项目中的文件以创建 Symfony Web 应用程序,该应用程序显示符合指定条件的餐厅。

在根目录中,导航到.env文件并定义以下环境变量,以设置连接字符串和目标数据库:

.env
...
MONGODB_URL=<your Atlas connection string>
MONGODB_DB=sample_restaurants

要检索连接字符串,请参阅创建 MongoDB Atlas 集群步骤。

src/Document目录中创建Restaurant.php文件并粘贴以下代码,以创建表示restaurants集合中文档的实体:

src/Document/Restaurant.php
<?php
declare(strict_types=1);
namespace App\Document;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
#[ODM\Document(collection: 'restaurants')]
class Restaurant
{
#[ODM\Id]
public ?string $id = null;
#[ODM\Field]
public string $name;
#[ODM\Field]
public string $borough;
#[ODM\Field]
public string $cuisine;
}

接下来,在src/Controller目录中创建RestaurantController.php文件并粘贴以下代码以处理应用程序中的端点:

src/Controller/RestaurantController.php
<?php
declare(strict_types=1);
namespace App\Controller;
use App\Document\Restaurant;
use Doctrine\ODM\MongoDB\DocumentManager;
use MongoDB\BSON\Regex;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class RestaurantController extends AbstractController
{
private DocumentManager $dm;
private LoggerInterface $logger;
public function __construct(DocumentManager $dm, LoggerInterface $logger)
{
$this->dm = $dm;
$this->logger = $logger;
}
#[Route('/', name: 'restaurant_index', methods: ['GET'])]
public function index(Request $request): Response
{
return $this->render('restaurant/index.html.twig');
}
#[Route('/restaurant/browse', name: 'restaurant_browse', methods: ['GET'])]
public function browse(Request $request): Response
{
$restaurantRepository = $this->dm->getRepository(Restaurant::class);
$queryBuilder = $restaurantRepository->createQueryBuilder();
$restaurants = $queryBuilder
->field('borough')->equals('Queens')
->field('name')->equals(new Regex('Moon', 'i'))
->getQuery()
->execute();
return $this->render('restaurant/browse.html.twig', ['restaurants' => $restaurants]);
}
}

控制器文件定义index()方法,该方法在 Web 应用程序的首页上显示文本。该文件还定义了browse()方法,该方法查找borough字段为'Queens'name字段包含字符串'Moon'的文档。然后,此方法显示/restaurant/browse/路由处的文档。 browse()方法使用QueryBuilder类来构造查询。

接下来,创建模板以自定义 Web 应用程序的外观。

创建templates/restaurant目录并在其中填充以下文件:

  • index.html.twig

  • browse.html.twig

将以下代码粘贴到index.html.twig文件中:

Templates/restaurant/index.html.twig
{# templates/restaurant/index.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
<h1>Welcome to the Symfony MongoDB Quickstart!</h1>
{% endblock %}

将以下代码粘贴到browse.html.twig文件中:

Templates/restaurant/browse.html.twig
{# templates/restaurant/browse.html.twig #}
{% extends 'base.html.twig' %}
{% block title %}
Search Restaurants
{% endblock %}
{% block body %}
<h1>Search Restaurants</h1>
{% for restaurant in restaurants %}
<p>
<span style="color:deeppink;"><b>Name: </b>{{ restaurant.name }}</span><br>
<b>Borough:</b> {{ restaurant.borough }}<br>
<b>Cuisine:</b> {{ restaurant.cuisine }}<br>
</p>
{% endfor %}
{% endblock %}

从应用程序根目录运行以下命令,启动 PHP 内置 Web 服务器:

symfony server:start

服务器启动后,输出以下消息:

[OK] Web server listening
The Web server is using PHP FPM 8.3.4
http://127.0.0.1:8000

打开 URL http://127 。0 。0 。1 :8000 /restaurant/browse 在网络浏览器中。该页面显示了餐厅列表以及每家餐厅的详细信息,如以下屏幕截图所示:

餐厅网络应用程序屏幕截图

恭喜您完成快速入门教程!

完成这些步骤后,您就拥有一个 Symfony Web 应用程序,它可以连接到 MongoDB 部署、对示例数据运行查询并呈现检索到的结果。

查看以下资源,了解有关 Symfony 和 MongoDB 的更多信息:

后退

PHP 驱动程序

来年

PHP 库、框架和工具