mongodb/symfony-bundle

用于将mongodb/mongodb集成到Symfony的包

安装量: 25,844

依赖: 0

建议者: 0

安全性: 0

星标: 6

关注者: 5

分支: 3

开放问题: 3

类型:symfony-bundle

0.2.1 2023-12-09 15:01 UTC

This package is auto-updated.

Last update: 2024-09-09 19:44:23 UTC


README

此包提供了将MongoDB库集成到Symfony的功能。它设计为一个轻量级的替代品,Doctrine MongoDB ODM,只提供与MongoDB交互的集成,而不提供ODM的所有功能。

安装

使用composer安装包

composer require mongodb/symfony-bundle

如果您已安装symfony/flex,则包将自动启用。否则,您需要手动将其添加到bundles.php文件中才能启用

// config/bundles.php

<?php

return [
    // ...
    MongoDB\Bundle\MongoDBBundle::class => ['all' => true],
];

配置

配置在config/packages/mongodb.yaml文件中完成。要开始,您至少需要配置一个客户端

# config/packages/mongodb.yaml
mongodb:
  clients:
    default: 'mongodb://localhost:27017'

id用于在服务容器中引用客户端。 uri是连接字符串,用于连接。出于安全考虑,建议从本地环境读取此值,并通过容器中的环境变量引用它

mongodb:
  clients:
    default: '%env(MONGODB_URI)%'

您还可以指定客户端的附加选项

mongodb:
  clients:
    default:
      uri: '%env(MONGODB_URI)%'
      default_database: #...
      uri_options: #...
      driver_options: #...

uri_optionsdriver_options直接传递给底层的MongoDB驱动。请参阅文档以了解可用选项。

如果您想配置多个客户端,可以通过向配置中添加更多客户端来实现

mongodb:
  default_client: default
  clients:
    default: '%env(MONGODB_URI)%'
    second: '%env(SECOND_MONGODB_URI)%'

注意

如果您添加了多个客户端,您需要指定default_client选项来指定应使用哪个客户端作为默认客户端!

客户端使用

对于每个客户端,容器中都会注册一个服务,服务ID为mongodb.client.{id}

注意

MongoDB驱动仅在实际需要时才连接到MongoDB,因此可以将客户端注入到服务中,而不会造成网络流量。

启用自动注入后,您可以像这样将客户端注入到服务中

use MongoDB\Client;

class MyService
{
    public function __construct(
        private Client $client,
    ) {}
}

如果您注册了多个客户端,您可以通过使用带有Client后缀的客户端名称作为参数名称来自动注入它们

use MongoDB\Bundle\Attribute\AutowireClient;
use MongoDB\Client;

class MyService
{
    public function __construct(
        // Will autowire the client with the id "second"
        private Client $secondClient,
    ) {}
}

或使用#[AutowireClient]属性

use MongoDB\Bundle\Attribute\AutowireClient;
use MongoDB\Client;

class MyService
{
    public function __construct(
        #[AutowireClient('second')]
        private Client $client,
    ) {}
}

数据库使用

客户端服务提供对数据库和集合的访问。您可以通过调用selectDatabase方法,传递数据库名和潜在选项来访问数据库

use MongoDB\Client;
use MongoDB\Database;

class MyService
{
    private Database $database;

    public function __construct(
        Client $client,
    ) {
        $this->database = $client->selectDatabase('myDatabase');
    }
}

另一种方法是使用#[AutowireDatabase]属性,引用数据库名

use MongoDB\Bundle\Attribute\AutowireDatabase;
use MongoDB\Database;

class MyService
{
    public function __construct(
        #[AutowireDatabase('myDatabase')]
        private Database $database,
    ) {}
}

如果未在属性中指定数据库名,则将使用默认数据库名(在default_database配置选项中指定)。如果没有定义默认数据库,则必须在属性中指定数据库名。

如果您定义了多个客户端,您也可以引用客户端

use MongoDB\Bundle\Attribute\AutowireDatabase;
use MongoDB\Database;

class MyService
{
    public function __construct(
        #[AutowireDatabase(database: 'myDatabase', client: 'second')]
        private Database $database,
    ) {}
}

集合使用

要注入集合,您可以在ClientDatabase实例上调用selectCollection方法。为了方便,#[AutowireCollection]属性提供了更快的替代方法

use MongoDB\Bundle\Attribute\AutowireCollection;
use MongoDB\Collection;

class MyService
{
    public function __construct(
        #[AutowireCollection(
            database: 'myDatabase',
            collection: 'myCollection'
        )]
        private Collection $collection,
    ) {}
}

您也可以省略collection选项,如果属性名与集合名匹配。在以下示例中,集合名为myCollection,从属性名推断而来

use MongoDB\Bundle\Attribute\AutowireCollection;
use MongoDB\Collection;

class MyService
{
    public function __construct(
        #[AutowireCollection(
            database: 'myDatabase',
        )]
        private Collection $myCollection,
    ) {}
}

如果您定义了多个客户端,您也可以引用客户端

use MongoDB\Bundle\Attribute\AutowireCollection;
use MongoDB\Collection;

class MyService
{
    public function __construct(
        #[AutowireCollection(
            database: 'myDatabase',
            client: 'second',
        )]
        private Collection $myCollection,
    ) {}
}

通过在配置中指定default_database选项,您可以在AutowireCollection属性中省略database选项

mongodb:
  clients:
    default:
      uri: '%env(MONGODB_URI)%'
+      default_database: 'myDatabase'
use MongoDB\Bundle\Attribute\AutowireCollection;
use MongoDB\Collection;

class MyService
{
    public function __construct(
        #[AutowireCollection]
        private Collection $myCollection,
    ) {}
}

指定选项

当使用AutowireDatabaseAutowireCollection属性时,您可以指定结果实例的额外选项。您可以传递以下选项:|| 选项 || 可接受类型 || | codec | DocumentCodec实例 | | typeMap | 包含类型映射信息的array | | readPreference | MongoDB\Driver\ReadPreference实例 | | writeConcern | MongoDB\Driver\writeConcern实例 | | readConcern | MongoDB\Driver\ReadConcern实例 |

除了传递一个实例之外,您还可以通过指定字符串为给定选项传递服务引用

use MongoDB\Bundle\Attribute\AutowireCollection;
use MongoDB\Collection;
use MongoDB\Driver\ReadPreference;

class MyService
{
    public function __construct(
        #[AutowireCollection(codec: Codec::class, readPreference: new ReadPreference('secondary'))]
        private Collection $myCollection,
    ) {}
}