corllete / silex-mongodb-provider
Silex 2.x MongoDB 服务提供者 - MongoDB PHP 库
Requires
- php: ~5.6||~7.0
- mongodb/mongodb: ^1.0.0
- pimple/pimple: ~3.0
Requires (Dev)
- phpunit/phpunit: ^5.5
This package is not auto-updated.
Last update: 2024-09-14 19:25:43 UTC
README
Silex MongoDB 服务提供者 - 将 Mongo PHP 库 与 Silex 2.x 集成
要求
- PHP 5.6+ || 7.0+
- php-mongodb (ext-mongodb)
- Silex 2.x
安装
$ composer require "corllete/silex-mongodb-provider=^1.0.0"
配置 & 使用
连接 URI 默认为 mongodb://:27017
。有关配置/设置选项和库使用的更多资源,请参阅 资源部分。
零配置
容器设置
use Corllete\SilexMongoDB\Provider\MongoDBServiceProvider; // connection uri: mongodb://:27017 $app->register(new MongoDBServiceProvider());
注意!
为了简单起见,我在以下所有示例中省略了
use Corllete\SilexMongoDB\Provider\MongoDBServiceProvider;
行。
使用方法
/** @var $mongo \MongoDB\Client */ $mongo = $app['mongodb']; // Instance of MongoDB\Database $database = $mongo->some_db; // Instance of MongoDB\Collection $collection = $mongo->some_collection; // OR the short version $collection = $app['mongodb']->some_db->some_collection // Instance of MongoDB\InsertOneResult $result = $collection->insertOne([ 'name' => 'Gandalf The White' ]); printf("Inserted %d document(s)\n", $result->getInsertedCount()); // Outputs: Inserted 1 document(s) // Instance of MongoDB\BSON\ObjectID $insertedId = $result->getInsertedId(); // Instance of MongoDB\Model\BSONDocument $document = $collection->findOne(['_id' => $insertedId]); echo $document['name']; // 'Gandalf The White' // Do your ninja magic here!
提供一些选项
容器设置
// connection uri: mongodb://example.com:27017 $app->register(new MongoDBServiceProvider(), [ 'mongodb.options' => [ 'uri' => 'mongodb://example.com:27017', 'uri_options' => [...], 'driver_options' => [ 'type_map' => [...], ], ], ]);
使用方法
/** @var $collection \MongoDB\Collection */ $collection = $app['mongodb']->db->collection;
多个连接
容器设置
// `first` is the default connection, living in $app['mongodb'] namespace $app->register(new MongoDBServiceProvider(), [ 'mongodbs.options' => [ 'first' => [ 'uri' => 'mongodb://first.com:27017', ], 'second' => [ 'uri' => 'mongodb://user:pass@second.com:27017/some_db', ], 'third' => [ 'uri' => 'mongodb://third.com:27017,mongodb://third.com:27018?replicaSet=myReplica', ], ], ]);
警告!
当直接在 URI 字符串中使用时,必须对用户名和密码应用
rawurlencode()
使用方法
// mongodb://first.com:27017 $first = $app['mongodb']; // OR $first = $app['mongodbs']['first']; // OR even $first = $app['mongodbs']['default']; // 'second' connection $second = $app['mongodbs']['second']; // 'third' connection $second = $app['mongodbs']['third']; // Do your ninja magic here!
通过连接名称引用显式设置默认连接
容器设置
// `second` is the default connection, living in $app['mongodb'] namespace $app->register(new MongoDBServiceProvider(), [ 'mongodbs.options' => [ 'first' => [ 'uri' => 'mongodb://first.com:27017', ], 'second' => [ 'uri' => 'mongodb://user:pass@second.com:27017/some_db', ], 'third' => [ 'uri' => 'mongodb://third.com:27017,mongodb://third.com:27018?replicaSet=myReplica', ], ], 'mongodbs.default' => 'second', ]);
使用方法
// 'second' is default now $second = $app['mongodb']; // OR $second = $app['mongodbs']['second']; // OR even $second = $app['mongodbs']['default'];
显式设置默认连接 - 连接标签
容器设置
// `second` is the default connection, living in $app['mongodb'] namespace $app->register(new MongoDBServiceProvider(), [ 'mongodbs.options' => [ 'first' => [ 'uri' => 'mongodb://first.com:27017', ], 'default' => [ 'uri' => 'mongodb://user:pass@second.com:27017/some_db', ], 'third' => [ 'uri' => 'mongodb://third.com:27017,mongodb://third.com:27018?replicaSet=myReplica', ], ], ]);
使用方法
// 'default' is... well, default $second = $app['mongodb']; // OR $second = $app['mongodbs']['default'];
组装 uri
容器设置
// resulting in uri: 'mongodb://username:password@example.com:27017/some_db' $app->register(new MongoDBServiceProvider(), [ 'mongodb.options' => [ 'host' => 'example.com', 'port' => '27017', 'username' => 'user', 'password' => 'pass', 'database' => 'some_db', ], ]);
在此有一些需要注意的事项
host
和port
在此配置场景中是必需的,没有默认的回退值- 如果你提供了
username
,则必需提供password
database
在所有情况下都是可选的
容器命名空间
默认情况下,此服务提供者注册在 mongodb.*
和 mongodbs.*
容器命名空间中。虽然核心参数和核心服务命名空间是大家必须接受的,但我认为占用命名空间(例如 mongodb
)从第三方服务提供者不是一种好的做法。正是这种不良的感觉让我实现了功能(我称之为 service provider namespace
)。其背后的逻辑非常简单 - 你将单命名空间和多命名空间值(遵循核心 DoctrineServiceProvider
的逻辑,它接受 db
和 dbs
命名空间)作为服务提供者构造函数的第一个和第二个参数提供给服务提供者。
这是一个“幕后”功能,你可能需要也可能不需要使用它,但最重要的是,你有选择权。
示例 - 占用 db
和 dbs
命名空间 - 假设没有注册 DoctrineServiceProvider
,没有 RDBMS 的空间!
$app->register(new MongoDBServiceProvider('db', 'dbs'), [ 'db.options' => [ 'uri' => 'mongodb://example.com:27017', ], ]);
使用方法
// namespace now is `db` $mongo = $app['db']; // ... and `dbs` $mongo = $app['dbs']['default'];
示例 - 仅覆盖单个连接命名空间为 db
$app->register(new MongoDBServiceProvider('db'), [ 'db.options' => [ 'uri' => 'mongodb://example.com:27017', ], ]);
使用方法
// namespace now is `db` $mongo = $app['db']; // but multi connection namespace is still `mongodbs` $mongo = $app['mongodbs']['default'];
MongoDB 客户端服务工厂
如果你出于任何原因(我不知道的原因!)决定你需要手动创建 \MongoDB\Client
实例,你可以使用与 MongoDBServiceProvider
注册的工厂可调用项。
$app->register(new MongoDBServiceProvider()); // somewhere else $app['myStrangeMongoDBClient'] = function ($app) { return $app['mongodb.factory']() }
工厂可调用项接受一个参数 - 连接配置选项数组,它们通过 mongodb.options
传递给服务提供者。如果没有传递配置选项,则使用 $app['mongodb.default_options']
(你可以覆盖它!)。
配置选项、服务参数和服务引用
配置选项
以下描述传递给 register()
容器方法的选项(请参阅示例部分)。
单个连接选项
mongodb
是单个连接配置命名空间,它可以被覆盖(参见命名空间部分)。如果发生这种情况,您必须在下面的示例中替换它。
mongodb.default_options
(数组
) - 用于零配置(或工厂服务)的选项,其格式与mongodb.options
相同。您可以直接在您的引导代码中覆盖它以更改默认行为。此选项的默认值
'mongodb.default_options' => [ 'uri' => null, 'host' => 'localhost', 'port' => 27017, 'database' => null, 'username' => null, 'password' => null, 'uri_options' => [], 'driver_options' => [ 'type_map' => [], ], ];
mongodb.options
(数组
) - 与mongodb.default_options
相同的格式,设置您的单个连接选项 - 更多关于uri
格式、uri 和驱动程序选项的信息,请参阅 MongoDB PHP 库 \MongoDB\Client 文档 和 官方 MongoDB连接 uri
文档。
多连接选项
mongodbs
是多连接配置命名空间,它可以被覆盖(参见命名空间部分)。如果发生这种情况,您必须在下面的示例中替换它。
mongodbs.options
(数组
) - 格式为LABEL => mongodb.options
的mongodb.options
数组。更多详情请参阅示例部分。mongodbs.default
(字符串
) - 连接标签,在mongodbs.options
中定义,将其设置为默认值(因此通过$app['mongodb']
获取)。
服务
通过 $app['SERVICE_NAME']
在您的代码中检索;
mongodb
(\MongoDB\Client
) - 默认 mongodb 客户端。此服务的名称取决于单个连接配置命名空间。mongodbs
(Pimple\Container
) - 包含所有已通过服务提供商注册的 mongodb 客户端。通过标签检索它们。此服务的名称取决于多连接配置命名空间。
内部
mongodb.factory
(可调用
) -\MongoDB\Client
工厂服务。此服务的名称取决于单个连接配置命名空间。mongodb.options.init
(可调用
) - 内部用于一次性准备配置数组。此服务的名称取决于单个连接配置命名空间。
参数
通过 $app['PARAMETER_NAME']
检索或覆盖;
mongodb.default_options
(数组
) - 设置以覆盖零配置设置和 mongodb 客户端工厂默认行为。更多详情请参阅配置选项
部分。此参数的名称取决于单个连接配置命名空间。
测试
在 composer 安装后运行 phpunit
测试;
$ composer install && bin/phpunit
您还可以打印覆盖率;
bin/phpunit --coverage-text
注意事项
s
是重要的!请确保不要弄混mongodb.options
和mongodbs.options
;- 似乎您的服务提供商配置未找到?在大多数情况下,您做了以下操作 - 您更改了 服务提供商命名空间,但您提供了默认命名空间配置选项(例如,使用
mongodb.options
而不是yourNamespace.options
); - 如果在您的代码中调用 mongodb 客户端后看到
\LogicException
,请检查您的服务提供商配置 - 很可能您提供了mongodb.options
和mongodbs.options
配置参数(这是非法的); - 您已在多连接设置中设置了 'default' 连接,但它不是默认的!嗯,几乎不是,但您可以检查您是否使用了两种设置默认连接的方法 - 标记为 'default' 的连接和
mongodbs.default = connection_name
。连接标签具有更高的优先级,因此在前一个场景中,标记为 'default' 的连接将是$app['mongodb']
和$app['mongodbs']['default']
返回的连接
贡献
Fork 我并打开一个 Pull Request。请在没有测试覆盖率的情况下不要提供代码贡献。首选单提交 Pull Request。
资源
- 官方 MongoDB PHP 库文档;
- 官方 MongoDB 文档;
- 官方 MongoDB PHP 扩展(新的
mongodb
驱动)文档; - MongoDB\Client - PHP 库文档。
- MongoDB 连接 - MongoDB 官方文档
- Silex 微框架
- Google - 其他一切!
许可证
本软件包遵循MIT 许可证
(c) Corllete