mongodb / symfony-bundle
用于将mongodb/mongodb集成到Symfony的包
Requires
- php: >=8.1
- mongodb/mongodb: ^1.17
- symfony/config: ^6.3 || ^7.0
- symfony/console: ^6.3 || ^7.0
- symfony/dependency-injection: ^6.3.5 || ^7.0
- symfony/http-kernel: ^6.3.5 || ^7.0
- symfony/runtime: ^6.3 || ^7.0
Requires (Dev)
- doctrine/coding-standard: ^12.0
- rector/rector: ^0.18
- symfony/browser-kit: ^6.3 || ^7.0
- symfony/filesystem: ^6.3 || ^7.0
- symfony/framework-bundle: ^6.3.5 || ^7.0
- symfony/phpunit-bridge: ~6.3.10 || ^6.4.1 || ^7.0.1
- symfony/stopwatch: ^6.3 || ^7.0
- symfony/web-profiler-bundle: ^6.3 || ^7.0
- symfony/yaml: ^6.3 || ^7.0
- zenstruck/browser: ^1.6
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_options
和driver_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, ) {} }
集合使用
要注入集合,您可以在Client
或Database
实例上调用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, ) {} }
指定选项
当使用AutowireDatabase
或AutowireCollection
属性时,您可以指定结果实例的额外选项。您可以传递以下选项:|| 选项 || 可接受类型 || | 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, ) {} }