Skip to content
ZF2 module for handling Mongo services, resultsets, and pagination
PHP
Pull request Compare This branch is 8 commits behind phly:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
src
test
vendor
.gitignore
.travis.yml
Module.php
README.md
composer.json
phpcs.xml
phpunit.xml

README.md

PhlyMongo - ZF2 Module for Mongo Integration

Build Status

PhlyMongo provides the following to assist with Mongo usage in ZF2:

  • Hydrating Mongo resultset
  • Mongo paginator adapter
  • Mongo paginator adapter for hydrating resultsets
  • Configurable service factories for the Mongo, MongoDB, and MongoCollection classes

Installation

Simplest is to add the following to composer.json:

{
    "minimum-stability": "dev",
    "require": {
        "phly/phly-mongo": "~1.0-dev"
    }
}

And then run:

php composer.phar install

Alternately, use git to install this as a submodule:

git submodule add git://github.com/phly/PhlyMongo vendor/PhlyMongo

Usage

Services

In order to remain as flexible as possible, the service factories require that you pass information to the constructors. As such, you should typically configure and setup the factories via your Module.php definition:

namespace My;

use PhlyMongo\MongoCollectionFactory;
use PhlyMongo\MongoDbFactory;

class Module
{
    public function getServiceConfig()
    {
        return array('factories' => array(
            'My\Mongo'           => 'PhlyMongo\MongoConnectionFactory',
            'My\MongoDB'         => new MongoDbFactory('my-site', 'My\Mongo'),
            'My\MongoCollection' => new MongoCollectionFactory('some-stuff', 'My\MongoDB'),
        ));
    }
}

If you want the server, server options, database, collection, or any service names to be dynamic, consider wrapping the factories in closures, and passing in configuration:

namespace My;

use PhlyMongo\MongoCollectionFactory;
use PhlyMongo\MongoConnectionFactory;
use PhlyMongo\MongoDbFactory;

class Module
{
    public function getServiceConfig()
    {
        return array('factories' => array(
            'My\Mongo'           => function ($services) {
                $config = $services->get('config');
                $config = $config['my']['mongo'];
                $factory = new MongoConnectionFactory($config['server'], $config['server_options']);
                return $factory->createService($services);
            },
            // and so on //
        ));
    }
}

However, if you need to do this, you might just as easily use the native Mongo classes.

Hydrating Cursor

The hydrating cursor is useful as a way to map result sets to objects.

Pass a MongoCursor instance to the constructor, along with a hydrator and a prototype object, and you're set:

use PhlyMongo\HydratingMongoCursor;
use Zend\Stdlib\Hydrator\ObjectProperty;

class Status
{
    public $_id;
    public $name;
    public $email;
    public $status;
}

$resultset = new HydratingMongoCursor(
    $collection->find(),
    new ObjectProperty,
    new Status
);
foreach ($resultset as $status) {
    printf('%s <%s>: %s', $status->name, $status->email, $status->status);
}

Paginator Adapter

The paginator adapter allows you to use a MongoCursor with Zend\Paginator.

Pass a MongoCursor to the constructor, and then pass the adapter to the paginator instance.

use PhlyMongo\PaginatorAdapter as MongoPaginatorAdapter;
use Zend\Paginator\Paginator;

$adapter   = new MongoPaginatorAdapter($collection->find());
$paginator = new Paginator($adapter);
$paginator->setCurrentPageNumber(5);
$paginator->setItemCountPerPage(10);

foreach ($paginator as $item) {
    // only receiving up to 10 items, starting at offset 50
}

Hydrating Paginator Adapter

This builds on the paginator adapter, and simply alters it to accept specifically a PhlyMongo\HydratingMongoCursor in the constructor, allowing you to return objects of a specific type during iteration.

use PhlyMongo\HydratingMongoCursor;
use PhlyMongo\HydratingPaginatorAdapter as MongoPaginatorAdapter;
use Zend\Paginator\Paginator;

$adapter   = new MongoPaginatorAdapter(new HydratingMongoCursor(
    $collection->find(),
    new ObjectProperty,
    new Status
));
$paginator = new Paginator($adapter);
$paginator->setCurrentPageNumber(5);
$paginator->setItemCountPerPage(10);

foreach ($paginator as $item) {
    // only receiving up to 10 items, starting at offset 50
    printf('%s <%s>: %s', $status->name, $status->email, $status->status);
}
Something went wrong with that request. Please try again.