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

Symfony MongoDB Integration

在此页面上

  • Overview
  • 为何在 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 string集群的位置和方式。要检索连接string ,请按照 Atlas文档中的“ 连接到集群”教程中的说明进行操作。

提示

将连接string保存在安全位置。

要学习;了解有关安装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文件并定义以下环境变量,以设立连接string和目标数据库:

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

要检索连接string ,请参阅创建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字段包含string 'Moon' 的文档。 然后,此方法显示/restaurant/browse/路由处的文档。 browse()方法使用QueryBuilder类来构造查询。

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

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

  • index.html.twig

  • browse.html.twig

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

Templates/restaurant/ 索引
{# 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 驱动程序