corllete/silex-mongodb-provider

Silex 2.x MongoDB 服务提供者 - MongoDB PHP 库

v1.1.0 2016-09-17 12:03 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:25:43 UTC


README

Build Status codecov Scrutinizer Code Quality

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',
    ],
]);

在此有一些需要注意的事项

  • hostport 在此配置场景中是必需的,没有默认的回退值
  • 如果你提供了 username,则必需提供 password
  • database 在所有情况下都是可选的

容器命名空间

默认情况下,此服务提供者注册在 mongodb.*mongodbs.* 容器命名空间中。虽然核心参数和核心服务命名空间是大家必须接受的,但我认为占用命名空间(例如 mongodb)从第三方服务提供者不是一种好的做法。正是这种不良的感觉让我实现了功能(我称之为 service provider namespace)。其背后的逻辑非常简单 - 你将单命名空间和多命名空间值(遵循核心 DoctrineServiceProvider 的逻辑,它接受 dbdbs 命名空间)作为服务提供者构造函数的第一个和第二个参数提供给服务提供者。

这是一个“幕后”功能,你可能需要也可能不需要使用它,但最重要的是,你有选择权。

示例 - 占用 dbdbs 命名空间 - 假设没有注册 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' => [],
    ],
];

多连接选项

mongodbs 是多连接配置命名空间,它可以被覆盖(参见命名空间部分)。如果发生这种情况,您必须在下面的示例中替换它。

  • mongodbs.options (数组) - 格式为 LABEL => mongodb.optionsmongodb.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.optionsmongodbs.options
  • 似乎您的服务提供商配置未找到?在大多数情况下,您做了以下操作 - 您更改了 服务提供商命名空间,但您提供了默认命名空间配置选项(例如,使用 mongodb.options 而不是 yourNamespace.options);
  • 如果在您的代码中调用 mongodb 客户端后看到 \LogicException,请检查您的服务提供商配置 - 很可能您提供了 mongodb.optionsmongodbs.options 配置参数(这是非法的);
  • 您已在多连接设置中设置了 'default' 连接,但它不是默认的!嗯,几乎不是,但您可以检查您是否使用了两种设置默认连接的方法 - 标记为 'default' 的连接和 mongodbs.default = connection_name。连接标签具有更高的优先级,因此在前一个场景中,标记为 'default' 的连接将是 $app['mongodb']$app['mongodbs']['default'] 返回的连接

贡献

Fork 我并打开一个 Pull Request。请在没有测试覆盖率的情况下不要提供代码贡献。首选单提交 Pull Request。

资源

许可证

本软件包遵循MIT 许可证

(c) Corllete