文档菜单
文档首页
/
MongoDB 驱动程序
/

Symfony MongoDB 集成

在本页

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

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

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

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

本指南的资源部分包含链接到更多资源和文档,以供进一步学习。

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

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

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

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

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

提示

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

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

本指南使用 Doctrine ODM,让您能够将 PHP 对象映射到 MongoDB 文档,并通过构建器 API 查询 MongoDB。

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

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

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

您通过提供连接字符串来指导驱动程序在哪里以及如何连接到您的 MongoDB 集群。要获取您的连接字符串,请遵循 Atlas 文档中的连接到您的集群教程中的说明。

提示

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

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

运行以下命令以创建名为restaurants:

composer create-project symfony/skeleton restaurants

安装PHP驱动和Doctrine ODM

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

composer require doctrine/mongodb-odm-bundle

提示

运行以下命令以安装ODM

Do you want to execute this recipe?

运行前面的命令后,您可能会看到以下提示

为确保 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

在您的Web浏览器中打开以下URL http://127.0.0.1:8000/restaurant/browse。页面显示餐厅列表以及每个餐厅的详细信息,如下截图所示

Restaurants web app screenshot

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

完成这些步骤后,您将拥有一个连接到您的MongoDB部署、在样本数据上运行查询并渲染检索结果的Symfony Web应用程序。

通过查看以下资源了解更多关于Symfony和MongoDB的信息

返回

PHP 驱动程序